问题标签 [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 - Haskell中的相互递归评估器
更新:我添加了一个描述我最终解决方案的答案(提示:单一Expr
数据类型是不够的)。
我正在为一种小表达式语言编写一个评估器,但我被困在这个LetRec
结构上。
这是语言:
到目前为止,这是评估员:
这是我要评估的测试功能:
编辑:
根据 Travis 的回答和 Luke 的评论,我更新了我的代码以将 MonadFix 实例用于 Error monad。前面的示例现在可以正常工作了!但是,下面的示例无法正常工作:
评估时,评估器循环,没有任何反应。我猜我在这里做了一些过于严格的事情,但我不确定它是什么。我是否违反了 MonadFix 法律之一?
haskell - Rand monad 的 MonadFix 实例
我想用System.Random.MWC.Monad的 Rand monad 生成无限的数字流。如果这个 monad 有一个 MonadFix 实例,或者像这样的实例:
然后可以写:
不过一个也没有。
我正在浏览MonadFix 文档,但我没有看到实现此实例的明显方法。
haskell - 有什么方法可以恢复足够的懒惰以在单子中打结吗?
我想通过打结来写一段漂亮的代码(节省我很多时间来实现)。大致是这样的,
理论上,myinstr
应该运行x
以获得一个值,这将成为n
. myinstr
在State
monad 中运行的 , 将n
进入状态,但这不会影响x
' 的计算。
我尝试过使用DoRec
和幼稚的实现mfix
,
但事情冻结了。是否有任何方法可以修复我的代码(或第一次正确设计它的方法)或者我应该写一些更直接的东西?
haskell - 使用 Cont 从未来和过去获取值
我正在用 Haskell 编写一个笨拙的解释器,我想出了我认为对程序非常有趣的描述:
然而,将一个 Brainfuck 程序的文本表示解析为这种数据类型是很棘手的。尝试正确解析方括号会出现问题,因为有一些打结要做,以便Instruction
循环内的最终链接再次链接到循环Control
。
更多初步信息。有关所有详细信息,请参阅github repo 上的此版本。
这是我尝试过的:
我想我可以以某种方式使用延续来将信息从'['
案例传递到']'
案例,反之亦然,但我对 Cont 没有足够的把握,除了对看起来可能有效的事情进行疯狂猜测之外,我还没有真正做任何事情,如上所示push
和pop
。这编译并运行,但结果是垃圾。
这种情况可以Cont
用来打结吗?如果不是,那么我应该使用什么技术来实现toProgram
?
注 1:我之前有一个微妙的逻辑错误:loopControl = branch is0
布尔值反转了。
注意 2:我设法使用MonadFix
(如 jberryman 建议的那样)State
提出了一个解决方案(请参阅github 存储库的当前状态)。我仍然想知道如何做到这一点Cont
。
注 3:我的 Racketeer 导师为我准备了一个类似的 Racket 程序(查看所有修订版)。他的管道/管道输出技术可以使用 翻译成 HaskellCont
吗?
tl; 博士我设法使用 MonadFix 做到了这一点,而其他人则设法使用 Racket 的延续组合器做到了这一点。我很确定这可以Cont
在 Haskell 中完成。你能告诉我怎么做吗?
haskell - 用状态单子打结
我正在处理一个涉及打结的 Haskell 项目:我正在解析图形的序列化表示,其中每个节点都位于文件的某个偏移量处,并且可能通过其偏移量引用另一个节点。do rec
所以我需要在解析时建立一个从偏移量到节点的映射,我可以在一个块中反馈给自己。
我有这个工作,并且有点合理地抽象成一个StateT
-esque monad 转换器:
该tie
函数是魔法发生的地方:调用runRecStateT
产生一个值和一个状态,我将其作为它自己的未来提供。请注意,它get
允许您读取过去和未来的状态,但put
只允许您修改“现在”。
问题 1:一般来说,这似乎是实现这种打结模式的一种不错的方式吗?或者更好的是,是否有人对此实施了通用解决方案,而我在窥探 Hackage 时忽略了这一点?我用头撞了一下Cont
monad,因为它看起来可能更优雅(参见Dan Burton的类似帖子),但我就是无法解决。
完全主观的问题 2:我对我的调用代码最终看起来的方式并不完全兴奋:
显然,这里省略了实现细节,重要的一点是我必须在 let 绑定past
中获取和future
状态,模式匹配它们(或显式使先前的模式变得惰性)以提取我关心的任何内容,然后构建我的节点,更新我的状态,最后返回节点。似乎不必要地冗长,而且我特别不喜欢意外地使提取and状态的模式变得严格是多么容易。那么,有人能想到更好的界面吗?past
future
haskell - Data.Map 实现中的错误?
我偶然发现了一些我猜是 中的错误Data.Map
,但这也很可能是我的 Haskell 知识中的错误。希望有人能澄清它是什么:)
请参考这个要点。我正在将循环链表结构序列化为字节流。对于任何给定的节点,形式为:
我希望它被序列化为一对字节:第一个字节表示val
,第二个字节表示字节流中next
可以定位的偏移量。例如,我期望:
被序列化为[0, 1, 1, 0]
. 没什么大不了的。
这里稍微棘手的部分是我正在利用该MonadFix
实例RWST
来“打结”字节流偏移量:我维护一个从节点到偏移量的映射,在序列化期间填充映射,但也引用映射中不存在的条目在序列化完成之前必然存在。
当地图实现是Data.HashMap.Lazy
(来自unordered-containers)时,这很有效。但是,当实现是通常的Data.Map
(来自容器)时,程序堆栈溢出 - 没有双关语 -Map
无限尝试使用(==)
.
所以我的问题是:这是一个错误Data.Map
,还是我对这些结构在存在mfix
缺陷的情况下应该如何表现的假设?
haskell - 是否可以为“免费”实现 MonadFix?
http://hackage.haskell.org/package/free inControl.Monad.Free.Free
允许访问任何给定的“免费单子” Functor
。但是,它没有MonadFix
实例。这是因为这样的实例无法编写,还是只是被遗漏了?
如果不能编写这样的实例,为什么不呢?
haskell - MonadFix 严格的语言
我正在为 Ocaml 中类似 haskell 的 do 表示法开发 camlp4 扩展,并试图弄清楚 GHC 如何编译递归 do-bindings(使用 -XDoRec 启用)。
我想知道一元定点组合器是否可能以严格的语言存在(如 Ocaml/F#/SML/...)?
如果是,它会是什么样子?会不会很有用?
haskell - 重复动作的类型类,直到固定点
我注意到执行一个动作直到它停止产生某些效果的一种常见模式,当人们知道这表示一个固定点时(即,不可能有未来的效果)。有一个类型类吗?
这被 MonadFix 覆盖了吗?看代码,似乎是这样,但我被wiki 页面吓跑了“很容易看到‘递归’并猜测它意味着递归或重复执行动作。不。”
在我看来,固定点也像是身份的双重性。也就是说,当与非身份结合时,身份会消失(0 表示 (+),1 表示 (*),[] 表示追加等)。而固定点会导致任何非固定点在下面的“放松”操作下消失。有没有办法将这种二元性形式化,这样做有用吗?即,MonadPlus 和/或 Monoid 和 MonadRelax 之间是否存在关系?
最后,我注意到放松几乎是一种展开/变形。这样表达会更好吗?