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


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

查看所有标签

猜你喜欢:

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

高扩展性网站的50条原则

高扩展性网站的50条原则

[美] Martin L. Abbott、[美]Michael T. Fisher / 张欣、杨海玲 / 人民邮电出版社 / 2012-6-3 / 35.00元

《高扩展性网站的50条原则》给出了设计高扩展网站的50条原则,如不要过度设计、设计时就考虑扩展性、把方案简化3倍以上、减少DNS查找、尽可能减少对象等,每个原则都与不同的主题绑定在一起。大部分原则是面向技术的,只有少量原则解决的是与关键习惯和方法有关的问题,当然,每个原则都对构建可扩展的产品至关重要。 主要内容包括: 通过克隆、复制、分离功能和拆分数据集提高网站扩展性; 采用横向......一起来看看 《高扩展性网站的50条原则》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具