问题标签 [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 投票
1 回答
311 浏览

haskell - Haskell - 如何构建一个读取一些设置文件的程序?

根据关于的介绍ReaderT,我只能找到:

这意味着

所以执行顺序会变成

这将要求我们的程序具有一些预先存在的值作为环境,但我认为大多数程序都需要加载这些环境值。例如数据库 URL、调试切换器或其他任何东西。

因此,我们有一个相反的执行顺序,根据 Monad 堆栈这是非法的:

monad 堆栈将变为:

这是非法的,因为IOmonad 不能是 monad 堆栈中的基础 monad。那么,有没有一种正确的方法来使用外部设置文件初始化我的程序?

PS1。我注意到xmonad 编译它的设置作为程序的一部分。我仍然不确定这是否是“加载”设置的唯一方法......

0 投票
1 回答
477 浏览

haskell - monad 转换器是否需要访问 monad 的内部结构?

是否有必要访问 monad 的内部结构来编写 monad 转换器?

例如:我想拥有来自 Data.Binary.GetGetT的 monad 转换Get器,但是这个模块不会暴露Getmonad 的内部结构。这是否意味着我唯一的方法是GetT直接添加到 Data.Binary.Get 模块?

0 投票
1 回答
244 浏览

scala - 如何将函数的返回类型指定为(任意)monad?

简而言之,我想声明一个这样的特征:

这样我就可以在不知道monadA是什么的情况下使用它,例如:


更多细节...

本质上,我想做这样的事情:

我希望能够传递MonadResultA MonadResultB不对函数进行任何更改的任何实例work
缺少的部分是SomeUnknowType,我想它应该有一个test类似的下面来使work函数编译。


正如我所说,我还在学习这个 monad 的东西......如果你发现我的代码不是正确的方法,非常欢迎你指出来~

非常感谢~~

0 投票
3 回答
794 浏览

scala - Scala 简化了嵌套的单子

我有一些用 Lift 编写的代码。基本上它的嵌套框(类似于选项的单子)。如果可能的话,我想把它简化一点。最好添加类型参数,以便在需要时可以轻松地将其更改为字符串或双精度。这是代码

如果发生异常并且 r 是 Req 对象,“tryo”是用于在 Box 中捕获和包装结果的辅助函数。“param”函数返回 Box[String](来自请求参数)。我想让它适用于 Int 的 String 等,如果可能的话,摆脱嵌套的 map/openOr (getOrElse 在你认为在 Option 类型中)。

单子变压器?

0 投票
2 回答
3463 浏览

scala - Do monad transformers apply to getting JSON from services?

I have a Play! 2 for Scala application that needs to retrieve some data in JSON format from an external service.

The Play! framework allows to make HTTP requests asynchronously by wrapping the response in a Promise. Promise is a monad that wraps a value that will be available in the future.

This is fine, but in my case what I get from the web service is a JSON string. I have to parse it and the parsing might fail. So I have to wrap whatever I get into an Option. The result is that many of my methods are returning Promise[Option[Whatever]]. That is, a value of type Whatever that will be, maybe, available later.

Now whenever I have to operate over such a value I need to map it twice. I was thinking of handling this in the following way:

  • creating a new type, say Hope[A], that wraps a Promise[Option[A]]
  • defining the relevant methods like map (or maybe I should use foreach and inherit from some collection trait?) and flatten
  • provide an implicit converter between Promise[Option[A]] and Hope[A].

It is easy to define map - the composition of two functors is again a functor - and flatten can be done explicitly in this case, or whenever composing a monad with Option.

But it is my limited understanding that I do not need to reinvent this stuff: monad transformer exist for exactly this case. Or, well, so I think - I have never used a monad tranformer - and this is the point of the question:

Can monad tranformers be used in this situation? How would I go about actually using them?

0 投票
3 回答
3104 浏览

asynchronous - 结合 F# 异步和可能的计算表达式

假设我想Optionasync工作流程中返回一段时间:

理想情况下,我会同时使用来自 FSharpx 的可能计算表达式作为异步来避免执行match. 我可以制作一个自定义构建器,但是有没有一种方法可以通用地组合两个计算表达式?它可能看起来像这样:

0 投票
5 回答
3203 浏览

list - 在新行中打印列表元素

我只是对列表和单子完全感到困惑,所以也许我的问题不正确或非常幼稚。我在这里看到了使用 mapM_ func 的方法:

但我不确切知道它是如何工作的,并且想知道如何以这样的方式做到这一点:

或者,如果我理解正确:

我知道 [1, 2, 3] 有 type[a]并且 print 有 type Show a => a -> IO ()。我也明白,为了使用 monad List,我们需要List a左边的类型和a -> List b右边的类型。我对吗?你能帮我解决这个问题吗?

升级版。感谢@MathematicalOrchid 解释 mapM_ 的工作原理。从我的角度来看,我想解释真正的问题不是在不同的行中打印任何结果,而是以 monad List 提供的方式执行一些 monadic 操作(因为现在我在 OpenGL 周围徘徊)。但我知道误解的根源在于混合单子。

UPD2。谢谢大家的回答。我为这个模糊的问题道歉。我不完全知道我需要什么答案以及问题是什么。那是因为我不了解一些基础知识。所以现在很难选择“正确的答案”,因为每个答案都与我正在寻找的东西有点和平。我决定选择最接近我想要的(虽然现在不是最有用的)。

0 投票
1 回答
1026 浏览

scala - 通过 Scala 中的解析器线程化额外状态

我会给你前面的 tl;dr

我正在尝试使用Scalaz 7中的状态单子转换器通过解析器线程化额外的状态,并且在不编写大量方法t m a -> t m b版本的情况下做任何有用的事情时遇到了麻烦m a -> m b

示例解析问题

假设我有一个包含嵌套括号的字符串,其中包含数字:

我还有一个新的变量名流(在这种情况下是字符):

我想从流的顶部提取一个名称,并在解析它时将其分配给每个括号表达式,然后将该名称映射到表示括号内容的字符串,并将嵌套的括号表达式(如果有)替换为他们的名字。

为了使这一点更具体,这是我希望上面示例输入的输出看起来像的样子:

在给定的级别上,可能存在一串数字或任意多个子表达式,但这两种内容不会混合在一个括号表达式中。

为简单起见,我们假设名称流永远不会包含重复项或数字,并且始终包含足够的名称供我们输入。

使用带有一些可变状态的解析器组合器

上面的例子是这个 Stack Overflow question中解析问题的一个稍微简化的版本 。我用一个大致如下的解决方案回答了这个问题:

这还不错,但我更愿意避免可变状态。

我想要的是

Haskell 的Parsec库使将用户状态添加到解析器变得非常容易:

这是我上面的 Scala 解析器的一个相当简单的翻译,但没有可变状态。

我试过的

我正在尝试使用 Scalaz 的状态单子转换器尽可能接近 Parsec 解决方案,所以Parser[A]我正在使用StateT[Parser, Stream[Char], A]. 我有一个“解决方案”,允许我编写以下内容:

这行得通,而且它并不比可变状态版本或 Parsec 版本简明多少。

但我ExtraStateParsers的丑陋如罪——我不想比我已经拥有的更多地尝试你的耐心,所以我不会在这里包含它(虽然这里有一个链接,如果你真的想要的话)。我必须为我的和类型(、、和,以防你计算)编写上面使用的每个Parser和方法的新版本。如果我需要使用其他组合器,我也必须编写它们的新状态转换器级版本。ParsersExtraStateParsersESPrep1~><~|

有没有更清洁的方法来做到这一点?我很想看到一个 Scalaz 7 的状态 monad 转换器用于通过解析器线程化状态的示例,但 Scalaz 6 或 Haskell 示例也将很有用和赞赏。

0 投票
4 回答
2039 浏览

haskell - Haskell 应用变压器的例子

www.haskell.org 上的 wiki 告诉我们以下有关 Applicative Transformers 的信息:

那么应用变压器在哪里呢?答案是,我们不需要针对应用函子的特殊转换器,因为它们可以以通用方式组合。 http://www.haskell.org/haskellwiki/Applicative_functor#Applicative_transfomers

我尝试了以下方法来尝试组合一堆应用函子。但我得到的只是一堆错误。这是代码:

这会产生很多类型错误,虽然我可以部分理解,但我根本无法解决它们。

错误在最后给出。

那么,例如,我如何结合 Maybe Applicative 和 List Applicative 呢?

例如,如何将 State Applicative 和 List Applicative 结合起来?还有其他例子吗,比如说,结合了 Maybe 和 List,Maybe 和 State,最后是可怕的 IO 和 State 应用程序?

谢谢。

GHCi 错误消息如下。

0 投票
1 回答
1952 浏览

haskell - 为什么 ListT monad 转换器被认为是错误的 - 它违反了哪些 monad 法则?

我看到提到过

ListT是一个不满足monad 法则的有问题的 monad 转换器的典型例子。

这可以通过一个简单的例子来证明吗?

编辑:我的想法ListT []有点错误,我错过了文档要求内部单子是可交换的。那么,ListT仅仅是有这个要求的意义上的越野车,还是还有其他问题?(Haskell wiki 上的示例都使用ListT IO并且IO显然不是可交换的。)