发布于 2015-03-10 19:50:01
这里正在使用不同的方法。
有时,基单Foo
以其转换器定义为FooT Identity
。例如,正如Daniel所指出的,来自变压器包的State
。
其他时候,基单Foo
是独立定义的。在这些情况下,通常情况下,Foo
和FooT Indentity
是不同的类型,但是它们是同构的。这意味着您可以在两种类型之间进行转换,而不会丢失任何信息。
我想,由于Maybe
是在Haskell报告中定义为Prelude
类型的,所以我们很难将它重新定义为同构的MaybeT Identity
。实际上,由于通过对Maybe a
和Just _
的模式匹配来破坏/消除Nothing
中的值是很常见的,所以我们不能使用另一个定义。如果我们有用户可定义的模式,我们可以使用pattern Just x = Module.Just (Identity x)
,但我们没有这些(目前)。
相反,像State
这样的其他单曲既不在Prelude
中,也不在Haskell报告中。它们通常也不会通过模式匹配被导入Control.Monad.State
的人破坏。在这种情况下,转移到StateT Identity
变体上的危害更小。
发布于 2015-03-10 19:36:46
为了实现向后兼容性,Maybe
monad没有被定义为MaybeT Identity a
,因为Maybe
早在MaybeT
之前就已经成为MaybeT
的一部分。
正确的是,在Identity
中使用monad转换器不会产生可以匹配的类型构造函数。幸运的是,在使用monad转换器范例时,我从未在monad构造函数上进行模式匹配。相反,您可以使用do
表示法和monad操作(liftM
、runReaderT
等)。
https://stackoverflow.com/questions/28971572
复制相似问题