问题标签 [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.

0 投票
3 回答
1562 浏览

haskell - Haskell中的相互递归评估器

更新:我添加了一个描述我最终解决方案的答案(提示:单一Expr数据类型是不够的)。


我正在为一种小表达式语言编写一个评估器,但我被困在这个LetRec结构上。

这是语言:

到目前为止,这是评估员:

这是我要评估的测试功能:


编辑:

根据 Travis 的回答和 Luke 的评论,我更新了我的代码以将 MonadFix 实例用于 Error monad。前面的示例现在可以正常工作了!但是,下面的示例无法正常工作:

评估时,评估器循环,没有任何反应。我猜我在这里做了一些过于严格的事情,但我不确定它是什么。我是否违反了 MonadFix 法律之一?

0 投票
3 回答
469 浏览

haskell - Rand monad 的 MonadFix 实例

我想用System.Random.MWC.Monad的 Rand monad 生成无限的数字流。如果这个 monad 有一个 MonadFix 实例,或者像这样的实例:

然后可以写:

不过一个也没有。

我正在浏览MonadFix 文档,但我没有看到实现此实例的明显方法。

0 投票
1 回答
368 浏览

haskell - 有什么方法可以恢复足够的懒惰以在单子中打结吗?

我想通过打结来写一段漂亮的代码(节省我很多时间来实现)。大致是这样的,

理论上,myinstr应该运行x以获得一个值,这将成为n. myinstrStatemonad 中运行的 , 将n进入状态,但这不会影响x' 的计算。

我尝试过使用DoRec和幼稚的实现mfix

但事情冻结了。是否有任何方法可以修复我的代码(或第一次正确设计它的方法)或者我应该写一些更直接的东西?

0 投票
2 回答
1490 浏览

haskell - 使用 Cont 从未来和过去获取值

我正在用 Haskell 编写一个笨拙的解释器,我想出了我认为对程序非常有趣的描述:

然而,将一个 Brainfuck 程序的文本表示解析为这种数据类型是很棘手的。尝试正确解析方括号会出现问题,因为有一些打结要做,以便Instruction循环内的最终链接再次链接到循环Control

更多初步信息。有关所有详细信息,请参阅github repo 上的此版本。

这是我尝试过的:

我想我可以以某种方式使用延续来将信息从'['案例传递到']'案例,反之亦然,但我对 Cont 没有足够的把握,除了对看起来可能有效的事情进行疯狂猜测之外,我还没有真正做任何事情,如上所示pushpop。这编译并运行,但结果是垃圾。

这种情况可以Cont用来打结吗?如果不是,那么我应该使用什么技术来实现toProgram


注 1:我之前有一个微妙的逻辑错误:loopControl = branch is0布尔值反转了。

注意 2:我设法使用MonadFix(如 jberryman 建议的那样)State提出了一个解决方案(请参阅github 存储库的当前状态)。我仍然想知道如何做到这一点Cont

注 3:我的 Racketeer 导师为我准备了一个类似的 Racket 程序(查看所有修订版)。他的管道/管道输出技术可以使用 翻译成 HaskellCont吗?


tl; 博士我设法使用 MonadFix 做到了这一点,而其他人则设法使用 Racket 的延续组合器做到了这一点。我很确定这可以Cont在 Haskell 中完成。你能告诉我怎么做吗?

0 投票
5 回答
3247 浏览

haskell - 用状态单子打结

我正在处理一个涉及打结的 Haskell 项目:我正在解析图形的序列化表示,其中每个节点都位于文件的某个偏移量处,并且可能通过其偏移量引用另一个节点。do rec所以我需要在解析时建立一个从偏移量到节点的映射,我可以在一个块中反馈给自己。

我有这个工作,并且有点合理地抽象成一个StateT-esque monad 转换器:

tie函数是魔法发生的地方:调用runRecStateT产生一个值和一个状态,我将其作为它自己的未来提供。请注意,它get允许您读取过去和未来的状态,但put只允许您修改“现在”。

问题 1:一般来说,这似乎是实现这种打结模式的一种不错的方式吗?或者更好的是,是否有人对此实施了通用解决方案,而我在窥探 Hackage 时忽略了这一点?我用头撞了一下Contmonad,因为它看起来可能更优雅(参见Dan Burton的类似帖子),但我就是无法解决。

完全主观的问题 2:我对我的调用代码最终看起来的方式并不完全兴奋:

显然,这里省略了实现细节,重要的一点是我必须在 let 绑定past中获取和future状态,模式匹配它们(或显式使先前的模式变得惰性)以提取我关心的任何内容,然后构建我的节点,更新我的状态,最后返回节点。似乎不必要地冗长,而且我特别不喜欢意外地使提取and状态的模式变得严格是多么容易。那么,有人能想到更好的界面吗?pastfuture

0 投票
2 回答
280 浏览

haskell - Put 的 MonadFix 实例

一个简单的问题,我希望:binary包定义了两种类型,GetPut. 前者本质上是一个状态单子,后者本质上是一个作家。state 和 writer 都有合理的MonadFix例子,所以我希望Get并且Put也会这样做。

Get做。Put没有。那么,是否可以为(真的为)定义一个合适的MonadFix实例?PutPutM

一个更普遍的问题是:通常如何验证类型类实例实际上满足该类型类的规则?

0 投票
1 回答
560 浏览

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缺陷的情况下应该如何表现的假设?

0 投票
3 回答
1223 浏览

haskell - 是否可以为“免费”实现 MonadFix?

http://hackage.haskell.org/package/free inControl.Monad.Free.Free允许访问任何给定的“免费单子” Functor。但是,它没有MonadFix实例。这是因为这样的实例无法编写,还是只是被遗漏了?

如果不能编写这样的实例,为什么不呢?

0 投票
1 回答
409 浏览

haskell - MonadFix 严格的语言

我正在为 Ocaml 中类似 haskell 的 do 表示法开发 camlp4 扩展,并试图弄清楚 GHC 如何编译递归 do-bindings(使用 -XDoRec 启用)。
我想知道一元定点组合器是否可能以严格的语言存在(如 Ocaml/F#/SML/...)?
如果是,它会是什么样子?会不会很有用?

0 投票
1 回答
255 浏览

haskell - 重复动作的类型类,直到固定点

我注意到执行一个动作直到它停止产生某些效果的一种常见模式,当人们知道这表示一个固定点时(即,不可能有未来的效果)。有一个类型类吗?

这被 MonadFix 覆盖了吗?看代码,似乎是这样,但我被wiki 页面吓跑了“很容易看到‘递归’并猜测它意味着递归或重复执行动作。不。”

在我看来,固定点也像是身份的双重性。也就是说,当与非身份结合时,身份会消失(0 表示 (+),1 表示 (*),[] 表示追加等)。而固定点会导致任何非固定点在下面的“放松”操作下消失。有没有办法将这种二元性形式化,这样做有用吗?即,MonadPlus 和/或 Monoid 和 MonadRelax 之间是否存在关系?

最后,我注意到放松几乎是一种展开/变形。这样表达会更好吗?