haskell – 试图了解monad变压器产生的类型

栏目: 编程语言 · 发布时间: 6年前

内容简介:http://stackoverflow.com/questions/7088085/trying-to-understand-the-types-produced-by-monad-transformers
docs for Control.Monad.Trans.Error

提供了组合两个单体的例子:

type ErrorWithIO e a = ErrorT e IO a
==> ErrorT (IO (Either e a))

我发现这是违反直觉的:即使ErrorT假定是包装IO,它看起来像是将错误信息注入到IO操作的结果类型中.我会预料到的

==> ErrorT (Either e (IO a))

基于“包装”一词的通常含义.

为了让事情变得更加混乱,StateT做了一些:

type MyError e = ErrorT e Identity  -- (see footnote)
type StateWithError s e a = StateT s (MyError e) a
==> StateT (s -> ErrorT (Either e (a, s)))

状态类型已被注入到右侧,但是整体也已被包装在一个函数中.

为了让事情变得更加混乱,如果将单体组合在一起:

type ErrorWithState e s a = ErrorT e (State s) a
==> ErrorT (StateT (s -> (Either e a, s)))

“外”还是一个功能;它不会产生类似于e(s – >(a,s))的东西,其中状态函数嵌套在错误类型中.

我确信这一切都有一些基本的逻辑一致性,但我不太明白.因此,即使我不用理解每个单体意味着什么,我觉得很难想像将一个单体与另一个单体结合起来是什么意思.

有人可以启发我吗?

(脚注:我正在组合ErrorT与Identity,以便StateWithError和ErrorWithState彼此一致,为了说明的目的,通常我只是使用StateWithError s e a = StateT s(E e e)a并放弃ErrorT层.

I find this counterintuitive: even though ErrorT is supposedly wrapping IO, it looks like the error information has been injected into the IO action’s result type. 

莫纳德变压器通常不会“包裹”其适用的单体,至少没有任何明显的意义.把它当作“包装”,这将意味着我的心灵的作曲家的构成,这具体在这里没有发生.

为了说明,状态和可能的函子构成,扩展了定义,将如下所示:

newtype StateMaybe s a = StateMaybe (s -> (Maybe a, s))    -- == State s (Maybe a)
newtype MaybeState s a = MaybeState (Maybe (s -> (a, s)))  -- == Maybe (State s a)

请注意,在第一种情况下,状态正常,Nothing不影响状态值;在第二种情况下,我们既有一个简单的国家职能,也没有任何事情.在这两种情况下,两个单体的特征行为实际上都是结合在一起的.这不应该是令人惊讶的,因为毕竟,这些都是一样的,只是通过使用一个monad作为在另一个中使用的常规值的值.

将此与StateT进行比较也许:

newtype StateTMaybe s a = StateTMaybe (s -> Maybe (a, s))

在这种情况下,两者编织在一起;事情以国家的正常方式进行,除非我们打了Nothing,在这种情况下计算被中止.这与上述情况截然不同,这就是为什么单体变压器首先存在的原因,它们天生地组合起来并不需要任何特殊的机械,因为它们彼此独立运作.

就“外部”而言,可能有助于将“外部”变压器视为在某种意义上,在处理monad中的值时行为“优先”的变压器,而“内在”monad只照常看到生意.请注意,这就是为什么IO始终是最内层的 – 它不会让任何其他事情起作用,而假设的IOT变压器将被迫允许包装的monad拉取各种shenanigans,如复制或丢弃RealWorld令牌.

> StateT和ReaderT都把“内在”monad围绕着函数的结果;你必须提供一个国家的价值或环境,才能得到变化的monad.

> MaybeT和ErrorT都将自己置于变形的monad中,确保它可以以通常的方式运行,除了可能不存在的值.

>作家是完全被动的,只是附加在monad的价值观,因为它不会影响行为.

> ContT保持自己的事情,只通过包装结果类型来完全处理变换的monad.

那是一个有点手的波浪,但是,呃,单变形变压器是一种特别的和混乱的开始,唉.我不知道对于所做出的具体选择是否有任何整洁的理论依据,除了他们工作的事实以外,还要做出你通常希望两个单子组合(而不是组合)做的事情.

Consequently I find it difficult to think about what it means to combine one monad with another, even when I have no trouble understanding what each monad means individually.

是的,这听起来像是期待什么,恐怕.

http://stackoverflow.com/questions/7088085/trying-to-understand-the-types-produced-by-monad-transformers


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

凸优化

凸优化

Stephen Boyd、Lieven Vandenberghe / 王书宁、许鋆、黄晓霖 / 清华大学出版社 / 2013-1 / 99.00元

《信息技术和电气工程学科国际知名教材中译本系列:凸优化》内容非常丰富。理论部分由4章构成,不仅涵盖了凸优化的所有基本概念和主要结果,还详细介绍了几类基本的凸优化问题以及将特殊的优化问题表述为凸优化问题的变换方法,这些内容对灵活运用凸优化知识解决实际问题非常有用。应用部分由3章构成,分别介绍凸优化在解决逼近与拟合、统计估计和几何关系分析这三类实际问题中的应用。算法部分也由3章构成,依次介绍求解无约束......一起来看看 《凸优化》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试