【发布时间】:2013-10-17 11:44:59
【问题描述】:
我想将一元值转换为其他 Monad 类的一元值。
假设我有一个实例声明:
instance ClassM TypeT where
funcX = abc >>= \x -> return (x)
ClassM : 是一个自己的 monad 定义的类
TypeT : 是一个自己定义的类型/数据,带有一个 monad 实例实现
abc : 属于 IO a 类型
如何转换 abc::IO a 的一元值
到 classM m => m a
的一元值
又名 m1 a -> m2 a(其中 m1 不是 m2)(例如:IO 5 -> Just 5)
我的 funcX 实现显然不正确。如果可能,正确的实现应该是什么?
感谢您的时间和帮助。
【问题讨论】:
-
对于
m a到IO a,请查看MonadIO中的liftIO。更一般地说,lift来自MonadTrans。否则,也许你会对mmorph包感兴趣。 -
您可能已经意识到这一点,但只是说:
\x -> return x只是return,并且根据单子法则,v >>= return必须再次成为v,始终如此。所以目前你只有funcX = abc。 -
设计不可能。您不能将 IO 从值中解开。它是永恒的,就像钻石一样。也许如果您告诉我们您要解决的问题,我们将能够为您提供帮助。