首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用monad转换器和标识monad派生基monad

使用monad转换器和标识monad派生基monad
EN

Stack Overflow用户
提问于 2015-03-10 18:37:51
回答 2查看 190关注 0票数 3

我读到(例如这里这里)所有的基本单体(MabyeError,.)从它们相应的单端变压器(MaybeTErrorT,.)导出。使用标识单Identity。一个例子是:

代码语言:javascript
运行
复制
type Maybe a = MaybeT Identity a

但是,这当然不会导致Maybe a的构造函数。在资料来源中,MaybeT被定义为newtype MaybeT m a = MaybeT (m (Maybe a))

我错过了什么重要的事情吗?如何使用相应的单体变压器和标识单体导出基座单体,从而形成混凝土?

可以与之匹配的构造函数?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-10 19:50:01

这里正在使用不同的方法。

有时,基单Foo以其转换器定义为FooT Identity。例如,正如Daniel所指出的,来自变压器包的State

其他时候,基单Foo是独立定义的。在这些情况下,通常情况下,FooFooT Indentity是不同的类型,但是它们是同构的。这意味着您可以在两种类型之间进行转换,而不会丢失任何信息。

我想,由于Maybe是在Haskell报告中定义为Prelude类型的,所以我们很难将它重新定义为同构的MaybeT Identity。实际上,由于通过对Maybe aJust _的模式匹配来破坏/消除Nothing中的值是很常见的,所以我们不能使用另一个定义。如果我们有用户可定义的模式,我们可以使用pattern Just x = Module.Just (Identity x),但我们没有这些(目前)。

相反,像State这样的其他单曲既不在Prelude中,也不在Haskell报告中。它们通常也不会通过模式匹配被导入Control.Monad.State的人破坏。在这种情况下,转移到StateT Identity变体上的危害更小。

票数 3
EN

Stack Overflow用户

发布于 2015-03-10 19:36:46

为了实现向后兼容性,Maybe monad没有被定义为MaybeT Identity a,因为Maybe早在MaybeT之前就已经成为MaybeT的一部分。

正确的是,在Identity中使用monad转换器不会产生可以匹配的类型构造函数。幸运的是,在使用monad转换器范例时,我从未在monad构造函数上进行模式匹配。相反,您可以使用do表示法和monad操作(liftMrunReaderT等)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28971572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档