问题标签 [monadfix]
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 - 是否有 Monad 的实例但没有 MonadFix 的实例?
问题主要在标题中。似乎mfix
可以为任何一元计算定义,即使它可能会发散:
这种结构有什么问题?另外,为什么 theMonad
和MonadFix
typeclasses 是分开的(即什么类型有一个实例Monad
但没有 of MonadFix
)?
algorithm - 一棵懒惰的、广度优先的单子玫瑰树展开是否可能?
Data.Tree
包含unfoldTreeM_BF
和unfoldForestM_BF
函数使用单子动作的结果构建树的广度优先。使用森林展开器可以轻松编写树展开器,因此我将重点关注后者:
从种子列表开始,它对每个种子应用一个函数,生成将产生树根和种子的动作,以用于下一层展开。使用的算法有些严格,因此使用unfoldForestM_BF
monadIdentity
与使用 pure 并不完全相同unfoldForest
。我一直在试图弄清楚是否有办法让它变得懒惰而不牺牲它的O(n)
时间限制。如果(正如 Edward Kmett 向我建议的那样)这是不可能的,我想知道是否可以用更受限制的类型来做到这一点,特别是要求MonadFix
而不是Monad
. 这里的概念是(以某种方式)设置指向未来计算结果的指针,同时将这些计算添加到待办事项列表中,因此如果它们在早期计算的影响中变得懒惰,它们将立即可用。
haskell - FreeT生成的解释器monad转换器的MonadFix实例?
我有一个由以下生成的标准解释器单子变换器的简化版本FreeT
:
p
是“提示”,并且r
是“环境”......人们可以使用类似的东西来运行它:
我觉得这种类型或多或少只是StateT
......如果有的话,Interactive p r IO
我认为是IO
......我认为......但是......好吧,无论如何,我的直觉说应该有一个很好的例子。
我试着写一个,但我似乎无法弄清楚。到目前为止,我最接近的尝试是:
我还尝试使用利用MonadFix
实例的版本m
,但也没有运气 -
任何人都知道这是否真的可能,或者为什么不是?如果是的话,我继续寻找的好地方是什么?
或者,在我的实际应用程序中,我什至不需要使用FreeT
...我可以使用Free
; 也就是说,haveInteractive
只是一个 monad 而不仅仅是一个 monad 转换器,并且有
如果这种情况有可能而不是一般的 FreeT 情况,我也会很高兴:)
haskell - lambda表达式中的波浪号是什么意思?
在本书的第 7 页,的定义中有一个波浪号(下图中红色圆圈所示)toggle
。波浪号是什么意思?
list - [] 的 MonadFix 实例
实例定义为
[]
但是对于被视为非确定性计算的单子,我无法理解其背后的直观含义。In mfix f
functionf
的参数不能严格,因此它不能检查参数。而且根据定义,它也不能在其输出中的任何地方使用该参数,否则在某些时候它会碰撞fix (f . head)
和发散。那么对于列表还有什么用途(或很好的例子)mfix
,除了mfix (const someList)
?
haskell - 在 Haskell 中使用 RecursiveDo 生成的重复 EDSL 代码
使用 ghc v8.0.1,使用 -O2 标志编译。
我遇到了 RecursiveDo (mdo) 的问题。有两个稍微不同的函数应该产生相同的输出,但它们不会。
以下函数产生正确的输出:
正确的输出是
以下函数产生不正确的输出:
错误的输出是
从 0007 到 000A 的行是从 0003 到 0006 的行的副本,并且(在这种特殊情况下)最终结果是 0007 处的无限循环。
有问题的代码在 Haskell 中实现了 EDSL(Ting Pen 的汇编程序)。程序的输出是 Ting Pen 的机器码。
我使用 MonadFix 能够捕获汇编语言中的前向标签,并且当我使用一些代码组合器时,我得到了不正确的输出(一些生成的代码被重复)。我已经包含了一些跟踪代码并且能够跟踪代码生成。RecursiveDo 机制有时会产生重复代码(另请参见下面提供的程序的输出)。
程序的输出如下。
proc1 的错误输出:
这是代码重复发生的地方:
proc2 的正确输出:
haskell - 一棵单子玫瑰树可以有一个 MonadFix 实例吗?
给定
有有效的MonadFix
实例吗?
我的尝试是
然而,当我实际尝试使用它时,这似乎并没有终止。该实例在某种程度上受到MonadFix
列表实例的启发。
haskell - Haskell:如果遍历参数,则 RWS 上的单子固定点正在循环
我正在编写一个程序,该程序涉及RWS
跟踪可变状态并生成一些日志。我的目的是定义一个计算来评估一些动作,收集随后的状态,并根据它在日志的开头附加一些东西。Writer
最小的例子:
在这里,我通过在事件发生MonadFix
之前写入日志来改变过去。act
它完美地返回"1ab"
。但是,如果我使用M
来遍历状态,那么它会挂起:
这种行为对我来说很奇怪,我不明白为什么这个计算会发散。更难证明其合理性,因为prepend
第二个变体中的状态不会在任何程度上改变状态。为什么这个程序不收敛?我可以做些什么来修复(inb4“hehe fix”)吗?
我知道我可以使用State
part of解决它RWS
,但出于某种原因,我想避免它。