我最近偶然发现了 巨灵 并简要介绍它,试着看看它在我的日常编码工作流程中是否有用。我很高兴看到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,但我不知道如何使其比现有的手工波浪形式更具体,或者直觉是否正确。