Questions tagged «monad-transformers»


3
mtl,transformers,monads-fd,monadLib和选择的悖论
黑客有几个用于monad变压器的软件包: mtl:Monad变压器库 变压器:混凝土函子和单子变压器 monads-fd:Monad类,使用函数依赖项 monads-tf:Monad类,使用类型族 monadLib:monad变压器的集合。 mtl-tf:使用类型族的Monad转换器库。 mmtl:模块化Monad变压器库 mtlx:具有类型索引的Monad转换器库,提供“免费”副本。 compose-trans:可组合的monad变压器 (也许我错过了一些) 我们应该使用哪一个? mtl是Haskell平台中的mtl,但我一直在reddit上听到它很不酷的消息。 但是无论如何,选择有什么不好,这不是一件好事吗? 好吧,我看到例如数据访问器的作者必须如何做出所有这些选择以迎合流行的选择: data-accessor-monadLib库:monadLib的monad的访问器函数 data-accessor-monads-fd库:使用访问器访问monads-fd State monad类中的状态 data-accessor-monads-tf库:使用访问器访问monads-tf State monad类型族中的状态 data-accessor-mtl库:使用访问器访问mtl State monad类中的状态 data-accessor-transformers库:使用Accessor来访问变形金刚状态monad中的状态 我想如果继续进行下去,例如几个竞争的Arrow软件包不断发展,我们可能会看到类似的东西:spoonklink-arrows-transformers,spoonklink-arrows-monadLib,spoonklink-tfArrows-transformers,spoonklink-tfArrows-monadLib,... 然后,我担心如果spoonklink被派生了,黑客程序将耗尽磁盘空间。:) 问题: 为什么会有这么多的monad变压器套件? 为什么[考虑]不酷? 主要区别是什么? 这些看似竞争的软件包中的大多数由Andy Gill编写,由Ross Paterson维护。这是否意味着这些软件包没有竞争,而是以某种方式协同工作?Andy和Ross是否认为自己的任何软件包都已过时? 您和我应该使用哪一个?


6
暂停单子
Monad可以完成许多令人惊奇的疯狂事情。他们可以创建保存值叠加的变量。它们可以允许您在计算数据之前访问将来的数据。它们可以允许您编写破坏性的更新,但实际上不是。然后,延续monad可以让您大开眼界!通常是您自己的。;-) 但这是一个挑战:您可以制作一个可以暂停的单子吗? 数据暂停sx 实例Monad(Pause) 变异::(s-> s)->暂停s() 产量::暂停s() 步骤:: s->暂停s()->(s,也许(暂停s())) 该Pause单子是一种状态的单子(因此mutate,具有明显的语义)。通常,这样的monad具有某种“运行”功能,该功能运行计算并让您返回最终状态。但是Pause有所不同:它提供了一个step函数,该函数将运行计算直到调用魔术yield函数。在这里,计算被暂停,将足够的信息返回给调用者,以便以后恢复计算。 要获得更大的声望,请执行以下操作:允许呼叫者修改两次呼叫之间的状态step。(例如,上面的类型签名应允许这样做。) 用例:编写执行复杂功能的代码通常很容易,但是使用一个完整的PITA对其进行转换以在其操作中也输出中间状态。如果您希望用户能够在执行过程中进行某些更改,那么事情就会变得非常复杂。 实施思路: 显然,可以使用线程,锁和来完成IO。但是,我们可以做得更好吗?;-) 延续单子的疯狂吗? 也许是某种作家monad,它只yield记录当前状态,然后我们可以step通过遍历日志中的状态来“假装”它。(显然,这排除了在步骤之间更改状态的可能,因为我们现在并没有真正“暂停”任何内容。)

2
哈斯克尔的嵌套国家
我正在尝试定义状态机家族,它们的状态有些不同。特别地,更“复杂”的状态机具有通过组合更简单的状态机的状态而形成的状态。 (这类似于面向对象的设置,其中对象具有多个属性,这些属性也是对象。) 这是我要实现的简化示例。 data InnerState = MkInnerState { _innerVal :: Int } data OuterState = MkOuterState { _outerTrigger :: Bool, _inner :: InnerState } innerStateFoo :: Monad m => StateT InnerState m Int innerStateFoo = do i <- _innerVal <$> get put $ MkInnerState (i + 1) return i outerStateFoo …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.