作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目前我在使用 monad 转换器时遇到了一些困难。我正在定义一些使用变压器的不同的非确定性关系。不幸的是,我无法理解如何将一种有效的模型清晰地转换为另一种。
假设这些关系是“foo”和“bar”。假设“foo”将 As 和 Bs 与 Cs 联系起来;假设“bar”将 Bs 和 Cs 与 Ds 联系起来。我们将根据“foo”来定义“bar”。更有趣的是,这些关系的计算将以不同的方式失败。 (因为 bar 关系依赖于 foo 关系,所以它的失败案例是一个超集。)因此我给出了以下类型定义:
data FooFailure = FooFailure String
data BarFailure = BarSpecificFailure | BarFooFailure FooFailure
type FooM = ListT (EitherT FooFailure (Reader Context))
type BarM = ListT (EitherT BarFailure (Reader Context))
foo :: A -> B -> FooM C
bar :: B -> C -> BarM D
convert :: (e -> e') -> ListT (EitherT e (Reader Context) a
-> ListT (EitherT e' (Reader Context) a
convert
功能如上图?
最佳答案
我认为转换是一个很好的答案,并使用 Control.Monad.Morph
和 Control.Monad.Trans.Either
它(几乎)写起来非常简单:
convert :: (Monad m, Functor m, MFunctor t)
=> (e -> e')
-> t (EitherT e m) b -> t (EitherT e' m) b
convert f = hoist (bimapEitherT f id)
ListT
不是
MFunctor
的实例.我想这是作者抵制
ListT
因为它
doesn't follow the monad transformer laws虽然因为编写类型检查实例很容易
instance MFunctor ListT where hoist nat (ListT mas) = ListT (nat mas)
Control.Monad.Morph
用于处理(部分)变压器堆栈的自然变换。我会说这符合将函数“足够”提升到堆栈中的定义。
关于haskell - 变形金刚下的转型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16552316/
在Java编程中经常碰到类型转换,对象类型转换主要包括向上转型和向下转型。 向上转型 我们在现实中常常这样说:这个人会唱歌。在这里,我们并不关心这个人是黑人还是白人,是成人还是小孩,也就是说我们
当使用使用 C 风格继承的 C API 时,(利用 C 结构的标准布局),例如 GLib ,我们通常使用 C 风格的转换来向下转换: struct base_object { int x;
我是一名优秀的程序员,十分优秀!