问题标签 [monadplus]
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中构建一个非确定性的monad转换器
我想在 haskell 中构建一个不确定的 monad 转换器,我相信它的行为与 ListT 和http://www.haskell.org/haskellwiki/ListT_done_right提出的替代 ListT 不同。其中第一个将 monad 与项目列表相关联;第二个将 monad 与单个项目相关联,但具有给定元素中的 monadic 动作影响列表后续槽中的 monadic 元素的属性。目标是建立一个单子变压器的形式
这样列表中的每个元素都有自己的 monad 与之关联,并且连续的元素具有独立的 monad。在这篇文章的最后,我稍微演示了这个 monad 应该给出的那种行为。如果您知道如何获得 ListT 的一些变体来提供这种行为,那也会很有帮助。
下面是我的尝试。它不完整,因为unpack
函数未定义。我该如何定义它?这是定义它的一次不完整的尝试,但它没有处理 monad m 包含Empty
Amb 列表的情况:
完整(不完整)代码:
期望行为示例
在这里,基本单子是State Int
谢谢。
更新:为什么 LogicT 不做我想做的事的一个例子。
这是 LogicT 在上面的简单示例中所做的:
haskell - 在 ErrorT 之上为变压器定义 MonadPlus 实例
我想定义一个 monad 转换器,除其他外,它赋予基本 monad 错误功能。如果基本 monad 是,则转换后的 monad 应该是 MonadPlus 的一个实例,但我不知道如何定义 MonadPlus 实例,以便 ErrorT 转换器返回多个答案(如果有多个答案)。我的两次尝试都在下面的代码中。在代码的末尾,有一个语句显示如果基本 monad 是 monad 转换器应该如何表现[]
。谢谢。
haskell - 这个 Haskell 函数是否被称为/实现为另一个名称?
我发现很多我自己拼凑起来的东西似乎很有用,实际上有一个我不知道的标准实现,所以很好奇是否有人可以说他们以前见过这种类型的东西:
它接受一个单子函数并将其折叠,直到一个谓词被替代选择,然后它返回谓词的结果:
我意识到这个名字是一个前奏冲突,我可能会用别的名字来命名它,但我想我会先看看在我不知道的标准库中是否已经有类似的功能......
此外,我想我很好奇我写的组合替代方案是否在其他地方定义,或者这些功能中的任何一个似乎一开始就被误导了。但我的问题的症结是,这是在其他地方实现的,还是在其他地方实现的非常相似的东西
haskell - mplus 必须始终是关联的吗?Haskell wiki vs. Oleg Kiselyov
Haskell wikibook断言
MonadPlus 的实例需要满足几个规则,就像 Monad 的实例需要满足三个 monad 定律一样。... 最重要的是 mzero 和 mplus 形成一个幺半群。
其结果是它mplus
必须是关联的。Haskell wiki同意。
然而,Oleg 在他的众多回溯搜索实现之一中写道
定义 non-associative 是否符合规定mplus
?前两个链接非常清楚地表明如果不是关联的,您就没有真实的MonadPlus
实例。mplus
但是如果Oleg这样做了……(另一方面,在该文件中,他只是定义了一个名为 的函数mplus
,并没有声称那是 mplus
of mplus
。MonadPlus
如果这是正确的解释,他选择了一个非常令人困惑的名称。)
haskell - Monoid vs MonadPlus
我对两者都很陌生Monads
,Monoids
最近还了解到MonadPlus
. 从我所见,Monoid
两者MonadPlus
都提供了一种具有关联二元运算和标识的类型。Monoid
(我将其称为数学术语中的半群。) 那么和之间有什么区别MonadPlus
?
haskell - Control.MonadPlus.Free 没有不必要的分发
我正在尝试使用一个免费的 monad 来构建一个 EDSL,用于构建像 Prolog 这样的 AND/OR 决策树,>>=
映射到 AND,并mplus
映射到 OR。我希望能够描述类似的东西A AND (B OR C) AND (D OR E)
,但我不希望分配性把它变成(A AND B AND D) OR (A AND B AND E) OR (A AND C AND D) OR (A AND C AND E)
. 最终,我想将 AND/OR 节点转换为约束求解器中的具体约束,而不会导致我希望求解器处理的备选方案数量的组合爆炸。
in Control.MonadPlus.Free
,Plus ms >>= f
导致f
应用于Pure
每个 monad 下的每个叶子ms
。这是必要的,因为它可能会为它替换f
的每个叶子产生不同的值。Pure
但是,在 中Plus ms >> g
,g
不受 的任何叶子影响ms
,因此将其分布在 中Plus
似乎没有必要。
通过反复试验,我发现我可以Control.MonadPlus.Free
使用新的Then
构造函数来扩展 monad:
在这里,新的Then
构造函数包含一系列我们忽略其值的 monad,然后是产生实际值的最终 monad。新Monad
实例如下所示:
操作符通过替换为“>>
封顶”任何现有叶子,将封顶的 monad 附加到列表中,并将值 monad 替换为新的。我知道将新 monad 附加到 的效率低下,但我认为它与将其新 monad 缝合到链的末尾一样糟糕(并且整个事情可以使用延续来重写)。Pure a
Pure ()
++
>>=
fmap
这似乎是一件合理的事情吗?这是否违反单子定律(这有关系吗?),还是有更好的方法来使用现有的Control.Monad.Free
?
haskell - 为什么是 MonadPlus 而不是 Monad + Monoid?
我试图了解背后的动机MonadPlus
。Monad
如果已经有 typeclasses和 ,为什么还有必要Monoid
?
当然,实例Monoid
是具体类型,而实例Monad
需要单个类型参数。(请参阅Monoid vs MonadPlus以获得有用的解释。)但是你不能重写任何类型约束
作为和的Monad
组合Monoid
?
以 的guard
函数Control.Monad
为例。它的实现是:
我只能使用Monad
and来实现它Monoid
:
MonadPlus
有人可以澄清和Monad
+之间的真正区别Monoid
吗?
haskell - 在单子变压器类型类中使用列表单子?
我的目标是创建一个函数,该函数在 ReaderT WriterT 堆栈或 RWS 堆栈中使用 list monad。更一般地说,我如何在 mtl 类型类(如 MonadReader、MonadWriter)中使用列表 monad?
我为什么要这样做?这个问题是在开始 Haskell中的一个练习。它要求我“使用 MonadReader 和 MonadWriter 包装基本列表 monad 的功能。要检查该功能是否通用,请使用两个不同的 monad 来 [测试] 请求的功能:ReaderT r (WriterT w []) a
并且RWST r w s m a
”因此这本书暗示这是可能的。
我不知道如何“告诉”编译器使用列表单子。如果我使用ask >>= lift
orask >>= lift . lift
我可以让 2 级堆栈 ( RWST []
) 或 3 级堆栈 ( ReaderT WriterT []
) 工作,但不能同时工作。
我的问题的重点:
另外,我想知道如何键入函数。到目前为止,我最好的尝试看起来像是pathImplicitStack' :: (MonadReader [(Int, Int)] m, MonadWriter [Int] m, MonadPlus m) => Int -> Int -> m ()
我知道这是不对的,可能缺少列表单子。另外,我认为 MonadPlus 可能在类型签名中很有用,但我不太确定。
这条线:do (s0, e0) <- ask >>= lift
是给我带来麻烦的一条。我尝试了 0、1 和 2 次升降机,但均未成功。我想ask
for a[(Int, Int)]
然后使用 list monad 来处理 a (Int, Int)
(并让 list monad 为我尝试所有可能性)。
作为练习的一部分,我需要能够调用pathImplicitStack'
这两个函数(或非常相似的函数):
这与我之前的问题有关:如何在 ReaderT 中使用 list monad?
整个文件便于测试:
编辑
根据 John L 的反馈,我尝试了
但正如他所指出的,它只能与一个 monad 转换器一起使用来包装列表 monad,即 RSWT,并且不能与 ReaderT WriterT 一起使用。所以这不是我正在寻找的解决方案。
haskell - Maybe MonadPlus Parsers 是否需要按特定顺序排列?
我正在完成wikibooks /haskell上的练习,MonadPlus 章节中有一个练习,希望你编写这个 hexChar 函数。我的函数如下所示工作,但问题是当我尝试切换函数周围的 2 个帮助解析器(digitParse 和 alphaParse)时,它会停止正常工作。如果我切换它们,我只能解析数字而不是字母字符。
为什么会这样?
loops - 如果 MonadPlus 是“生成器”类,那么什么是“消费者”类?
APipe
可以分为两部分:生成器部分 ( yield
) 和消费者部分 ( await
)。
如果你有一个Pipe
只使用它的生成器一半,并且只返回()
(或从不返回),那么它可以表示为“ListT
正确完成”。事实证明,它MonadPlus
可以用来表示像 ListT-done-right 这样的任何东西。引用 Gabriel Gonzalez 的话:
请注意,您可以
ListT
仅使用转换器依赖项构建任何(不仅仅是管道中的)。例如,以下是您将如何实现的ListT
模拟Pipes.Prelude.stdinLn
:这将像任何类型一样输入 check
ListT
并为所有这些做正确的事情。
ListT
所以我的问题是这样的:管道的MonadPlus
消费者部分是否有双重关系?
要求:
- 一个从不使用
yield
,只返回()
(或从不返回)但确实使用的管道await
可以表示为这个“对 ListT”。 - “dual to ListT”可以推广到“dual of MonadPlus”