内容简介:http://stackoverflow.com/questions/7088085/trying-to-understand-the-types-produced-by-monad-transformers
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条原则
[美] Martin L. Abbott、[美]Michael T. Fisher / 张欣、杨海玲 / 人民邮电出版社 / 2012-6-3 / 35.00元
《高扩展性网站的50条原则》给出了设计高扩展网站的50条原则,如不要过度设计、设计时就考虑扩展性、把方案简化3倍以上、减少DNS查找、尽可能减少对象等,每个原则都与不同的主题绑定在一起。大部分原则是面向技术的,只有少量原则解决的是与关键习惯和方法有关的问题,当然,每个原则都对构建可扩展的产品至关重要。 主要内容包括: 通过克隆、复制、分离功能和拆分数据集提高网站扩展性; 采用横向......一起来看看 《高扩展性网站的50条原则》 这本书的介绍吧!