问题标签 [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.
haskell - Haskell - 如何构建一个读取一些设置文件的程序?
根据关于的介绍ReaderT
,我只能找到:
这意味着
所以执行顺序会变成
这将要求我们的程序具有一些预先存在的值作为环境,但我认为大多数程序都需要加载这些环境值。例如数据库 URL、调试切换器或其他任何东西。
因此,我们有一个相反的执行顺序,根据 Monad 堆栈这是非法的:
monad 堆栈将变为:
这是非法的,因为IO
monad 不能是 monad 堆栈中的基础 monad。那么,有没有一种正确的方法来使用外部设置文件初始化我的程序?
PS1。我注意到xmonad
编译它的设置作为程序的一部分。我仍然不确定这是否是“加载”设置的唯一方法......
haskell - monad 转换器是否需要访问 monad 的内部结构?
是否有必要访问 monad 的内部结构来编写 monad 转换器?
例如:我想拥有来自 Data.Binary.GetGetT
的 monad 转换Get
器,但是这个模块不会暴露Get
monad 的内部结构。这是否意味着我唯一的方法是GetT
直接添加到 Data.Binary.Get 模块?
scala - 如何将函数的返回类型指定为(任意)monad?
简而言之,我想声明一个这样的特征:
这样我就可以在不知道monadA
是什么的情况下使用它,例如:
更多细节...
本质上,我想做这样的事情:
我希望能够传递MonadResultA
或 MonadResultB
不对函数进行任何更改的任何实例work
。
缺少的部分是SomeUnknowType
,我想它应该有一个test
类似的下面来使work
函数编译。
正如我所说,我还在学习这个 monad 的东西......如果你发现我的代码不是正确的方法,非常欢迎你指出来~
非常感谢~~
scala - Scala 简化了嵌套的单子
我有一些用 Lift 编写的代码。基本上它的嵌套框(类似于选项的单子)。如果可能的话,我想把它简化一点。最好添加类型参数,以便在需要时可以轻松地将其更改为字符串或双精度。这是代码
如果发生异常并且 r 是 Req 对象,“tryo”是用于在 Box 中捕获和包装结果的辅助函数。“param”函数返回 Box[String](来自请求参数)。我想让它适用于 Int 的 String 等,如果可能的话,摆脱嵌套的 map/openOr (getOrElse 在你认为在 Option 类型中)。
单子变压器?
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 aPromise[Option[A]]
- defining the relevant methods like
map
(or maybe I should useforeach
and inherit from some collection trait?) andflatten
- provide an implicit converter between
Promise[Option[A]]
andHope[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?
asynchronous - 结合 F# 异步和可能的计算表达式
假设我想Option
在async
工作流程中返回一段时间:
理想情况下,我会同时使用来自 FSharpx 的可能计算表达式作为异步来避免执行match
. 我可以制作一个自定义构建器,但是有没有一种方法可以通用地组合两个计算表达式?它可能看起来像这样:
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。谢谢大家的回答。我为这个模糊的问题道歉。我不完全知道我需要什么答案以及问题是什么。那是因为我不了解一些基础知识。所以现在很难选择“正确的答案”,因为每个答案都与我正在寻找的东西有点和平。我决定选择最接近我想要的(虽然现在不是最有用的)。
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
和方法的新版本。如果我需要使用其他组合器,我也必须编写它们的新状态转换器级版本。Parsers
ExtraStateParsers
ESP
rep1
~>
<~
|
有没有更清洁的方法来做到这一点?我很想看到一个 Scalaz 7 的状态 monad 转换器用于通过解析器线程化状态的示例,但 Scalaz 6 或 Haskell 示例也将很有用和赞赏。
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 错误消息如下。
haskell - 为什么 ListT monad 转换器被认为是错误的 - 它违反了哪些 monad 法则?
我看到提到过
ListT
是一个不满足monad 法则的有问题的 monad 转换器的典型例子。
这可以通过一个简单的例子来证明吗?
编辑:我的想法ListT []
有点错误,我错过了文档要求内部单子是可交换的。那么,ListT
仅仅是有这个要求的意义上的越野车,还是还有其他问题?(Haskell wiki 上的示例都使用ListT IO
并且IO
显然不是可交换的。)