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

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

内容简介: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


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

查看所有标签

猜你喜欢:

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

PHP and MySQL Web Development

PHP and MySQL Web Development

Luke Welling、Laura Thomson / Sams / July 25, 2007 / $49.99

Book Description PHP and MySQL Web Development teaches you to develop dynamic, secure, commerical Web sites. Using the same accessible, popular teaching style of the three previous editions, this b......一起来看看 《PHP and MySQL Web Development》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

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

Markdown 在线编辑器