问题标签 [monad-transformers]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
5951 浏览

haskell - How do I combine monads in Haskell?

Particularly, I need to be able to combine the CGI monad with the IO monad, but an example of how to combine the IO monad with the Maybe monad might be even better...

0 投票
3 回答
2160 浏览

haskell - 尴尬的单子变压器堆栈

解决来自 Google Code Jam 的问题(2009.1AA:“多基幸福”)我想出了一个尴尬的(代码方面的)解决方案,我对如何改进它很感兴趣。

简而言之,问题描述是:对于给定列表中的所有碱基,找到大于 1 的最小数字,其迭代计算数字平方和达到 1。

或伪Haskell中的描述(如果elem总是适用于无限列表,则可以解决它的代码):

还有我尴尬的解决方案:

  • 尴尬我的意思是它有这样的代码:happy <- lift . lift . lift $ isHappy Set.empty base cur
  • 我记住了 isHappy 函数的结果。将 State monad 用于记忆结果 Map。
  • 试图找到第一个解决方案,我没有使用headand filter(就像上面的伪 Haskell 一样),因为计算不是纯粹的(改变状态)。因此,我通过使用带有计数器的 StateT 和 MaybeT 进行迭代,以在条件成立时终止计算。
  • 已经在 aMaybeT (StateT a (State b))中,如果条件不适用于一个基数,则无需检查其他基数,因此我MaybeT在堆栈中有另一个基数。

代码:

其他使用 Haskell 的参赛者确实有更好的解决方案,但解决问题的方式不同。我的问题是关于对我的代码进行小的迭代改进。

0 投票
2 回答
3306 浏览

haskell - Haskell Monad Transformer 堆栈和类型签名

我正在尝试创建一堆 monad 转换器,但无法为我的函数获取正确的类型签名。(我对 Haskell 还是很陌生)

该堆栈结合了多个 StateT 转换器,因为我需要跟踪多个状态(其中两个可以被元组化,但我会在一秒钟内完成)和一个用于日志记录的 WriterT。

这是我到目前为止所拥有的:

我想popLine弄乱[Line]状态和xLineNum影响Int状态的功能。evalr是将传递给 的计算runPass1

每当我加载代码时,我都会遇到以下错误:

没有一个签名似乎是正确的,但 popLine 是第一个函数,所以它是唯一一个立即导致错误的函数。

我尝试在类型签名中添加它所建议的内容(例如:popLine :: (MonadState [Line] m) => ...但随后出现如下错误:

每当我尝试做一些不是类型变量的事情时,我似乎总是会收到这条消息。它似乎喜欢(MonadState s m)在其他东西上 ok 和 error,但是当我用 a[a]而不是sit 尝试它时,错误类似于上面。(最初 [Line] 和 Int 在一个状态下进行元组处理,但我收到了这个错误,所以我想我会尝试将它们置于不同的状态)。

GHC 6.10.4,库本图

那么,谁能告诉我发生了什么并给出解释/向我展示正确的类型签名,或者有没有人知道关于这些东西的一个很好的参考(到目前为止唯一有帮助的是“Monad Transformers Step by Step” ,但只使用一个辅助状态函数和一个StateT)?

提前谢谢了。

编辑
这是包含 JFT 和 Edward 建议的编译代码:

我结合incLineNumpopLine进入nextLine我仍然需要让 Writer monad 部分工作,但我想我知道从这里去哪里。多谢你们。

0 投票
3 回答
893 浏览

haskell - monad 转换器和多个 monad 的堆叠

我有f签名f :: [a] -> StateT Int Reader b [c]f'签名的功能f' :: a -> StateT Int Reader b [c]

f 中的计算(非常简化)如下所示:

而代替...我想返回带有单子材料的[c]部分。 是否有可能在不手动展开并再次手动将结果放在一起的情况下实现这一目标?我需要一个 List monad 在我的 monad 堆栈的底部来获取简单的代码吗?Reader Monad 显然不是 MonadPlus 类的实例。x ++[c]y
xy

0 投票
3 回答
1180 浏览

haskell - Using MonadError with Parsec

I'm trying to use MonadError together with Parsec. I've come up with the following code snippet:

However, ret is Left "SomeError", it seems the catchError doesn't have any effect. What's the right way to use MonadError here?

I'd prefer to use MonadError over Parsec's own error handling, as for example when I have:

If parser1 fails here, parser2 will continue, but I'd like to have an exception which aborts the parsing entirely.

0 投票
2 回答
301 浏览

haskell - 尝试实现 (>>=) 函数以创建自定义 monad 转换器时键入错误

我正在尝试为未来的项目创建一个 monad 转换器,但不幸的是,我对 Monad 类型类 (>>=) 函数的实现不起作用。

首先,这是底层 monad 的实现:

在这里,Monad 类型类的实现由 GHC 自动完成(使用GeneralizedNewtypeDeriving语言 pragma)。monad 转换器定义如下:

问题来自我实例化 Monad typeclasse 的 (>>=) 函数的方式:

在我看来,第一个>>=在底层m单子中运行。因此,runRuntimeT x >>=返回一个类型的值Runtime a(对吗?)。然后,下面的代码 ,id >>=应该返回一个 type 的值a。该值被传递给类型为 f 的函数f :: (Monad m) => a -> RuntimeT m b

这里出现了类型问题:f函数的类型与 (>>=) 函数所需的类型不匹配。我能让这个连贯吗?我明白为什么这不起作用,但我无法将它变成功能性的东西。

编辑:错误信息:

感谢您的帮助,并毫不犹豫地纠正我信息中的任何缺陷,
查理 P。

0 投票
1 回答
635 浏览

typeclass - 如何将 Maybe-Transformer MaybeT 变成 MonadWriter 的实例?

我正在尝试构建一个 MaybeT-Transformer Monad,基于Real World Haskell中的示例,Chapter Monad Transformers

这很好用,但现在我想让 MaybeT 成为 MonadWriter 的一个实例:

告诉是好的,但我无法正确使用监听功能。在构造函数折纸的 1 1/2 天后,我能想到的最好的就是你在上面看到的那个:unwrapped应该是 (Maybe a, w) 的元组,我想用 Maybe-Type 包装起来并将整个东西放在一个空的 MonadWriter 中。

但是编译器抱怨:

我错过了什么?

0 投票
6 回答
9334 浏览

design-patterns - 有没有人在野外遇到过 Monad Transformer?

在我的业务领域 - 金融机构的后台 IT - 软件组件携带全局配置,记录其进度,进行某种错误处理/计算短路是很常见的......可以在 Haskell 中由 Reader-、Writer-、Maybe-monad 等很好地建模,并与 monad 转换器组合在一起。

但似乎有一些缺点:monad 转换器背后的概念非常棘手且难以理解,monad 转换器会导致非常复杂的类型签名,并且会造成一些性能损失。

所以我想知道:处理上述常见任务时,monad 转换器是最佳实践吗?

0 投票
3 回答
7479 浏览

haskell - mtl、transformers、monads-fd、monadLib 和选择悖论

Hackage 有几个用于 monad 转换器的包:

  • mtl : Monad 转换器库
  • 变压器:具体函子和单子变压器
  • monads-fd : Monad 类,使用函数依赖
  • monads-tf : Monad 类,使用类型族
  • monadLib:monad 转换器的集合。
  • mtl-tf:使用类型族的 Monad 转换器库。
  • mmtl : 模块化 Monad 变压器库
  • mtlx:具有类型索引的 Monad 转换器库,提供“免费”副本。
  • compose-trans : 可组合的 monad 转换器

(也许我错过了一些)

我们应该使用哪一个?

mtl 是 Haskell 平台中的一个,但我一直在 reddit 上听到它不酷。

但是无论如何选择有什么不好的,这不只是一件好事吗?

好吧,我看到了例如 data-accessor 的作者如何不得不做出所有这些来迎合流行的选择:

  • data-accessor-monadLib 库:monadLib 的 monad 的访问器函数
  • data-accessor-monads-fd 库:使用 Accessor 访问 monads-fd State monad 类中的状态
  • data-accessor-monads-tf 库:使用 Accessor 访问 monads-tf State monad 类型族中的状态
  • data-accessor-mtl 库:使用 Accessor 访问 mtl State monad 类中的状态
  • data-accessor-transformers 库:使用 Accessor 访问变压器状态单子中的状态

我想如果这种情况继续下去,例如几个相互竞争的 Arrow 包演变,我们可能会看到类似的东西:spoonklink-arrows-transformers、spoonklink-arrows-monadLib、spoonklink-tfArrows-transformers、spoonklink-tfArrows-monadLib,...

然后我担心如果spoonklink 被分叉,Hackage 会耗尽磁盘空间。:)

问题:

  • 为什么有这么多单子变压器包?
  • 为什么 mtl [认为] 不酷?
  • 主要区别是什么?
  • 大多数这些看似相互竞争的软件包都是由 Andy Gill 编写的,并由 Ross Paterson 维护。这是否意味着这些软件包不是相互竞争而是以某种方式协同工作?Andy 和 Ross 是否认为他们自己的软件包已经过时?
  • 你和我应该使用哪一个?
0 投票
1 回答
878 浏览

haskell - 在 monad 转换器中使用类型同义词

是否可以使用类型同义词作为 monad 转换器类型构造函数的参数?特别是,如果应用的 monad 转换器有一个一元类型的同义词,它可以用作另一个 monad 转换器中的底层 monad 的类型吗?

从我看到的类型同义词不被接受为一流的类型构造函数,请参阅下面的示例和错误消息:

有没有办法避免扩展A定义中的类型同义词B a