我最近偶然发现了 巨灵 并简要介绍它,试着看看它在我的日常编码工作流程中是否有用。我很高兴看到Djinn有monad并试图看看它是否能够找到一些很酷的功能。
Djinn事实上确实有一些奇迹。最初(至少对我来说)非直观函数的类型签名 >>= (>>=)
是 Monad m => ((a -> m b) -> m a) -> (a -> m b) -> m b
。 Djinn能够通过陈述立即揭开神秘的神秘面纱
Djinn> f ? Monad m => ((a -> m b) -> m a) -> (a -> m b) -> m b
f :: (Monad m) => ((a -> m b) -> m a) -> (a -> m b) -> m b
f a b = a b >>= b
不幸的是,尽管知道Monad类型类,但Djinn似乎无法在monad上找到其他标准函数。
join
(应该是join = (>>= id)
或者在Djinn中更详细的语法join a = a >>= (\x -> x)
)Djinn> join ? Monad m => m (m a) -> m a -- join cannot be realized.
liftM
(应该是liftM f = (>>= (return . f))
或者在Djinn中更详细的语法liftM a b = b >>= (\x -> return (a x))
)Djinn> liftM ? Monad m => (a -> b) -> m a -> m b -- liftM cannot be realized.
即使是基本的
return :: Monad m => m a -> m (m a)
Djinn或者找不到return :: Monad m => (a, b) -> m (a, b)
。Djinn> f ? Monad m => (a, b) -> m (a, b) -- f cannot be realized.
Djinn知道如何使用 \
构建匿名函数,为什么会这样呢?
我粗略怀疑的是,也许Djinn有一个简单的类型类概念,并以某种方式对待 m a
如此“固定”那样 m (a, b)
不被视为一个案例 m a
,但我不知道如何使其比现有的手工波浪形式更具体,或者直觉是否正确。