发布于 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
复制相似问题