48得票2回答
“tying the knot”的解释

阅读 Haskell 相关内容时,我有时会遇到“tying the knot”这个表达式。我认为我理解它的作用,但不理解具体的实现方法。 那么,有没有任何好的、基础的、简单易懂的解释这个概念的资料呢?

40得票5回答
使用State monad来绑定状态

我正在处理一个Haskell项目,其中涉及打结:我正在解析图的序列化表示形式,其中每个节点都在文件的某些偏移量处,并且可能通过其偏移量引用另一个节点。因此,在解析时需要建立一个从偏移量到节点的映射表,我可以在do rec块中反馈给自己。 我已经让它工作了,并且有点抽象成了类似于StateT的...

19得票2回答
使用Cont从未来和过去中获取值

我正在用Haskell编写一个Brainfuck解释器,我想到了一种我认为非常有趣的程序描述:data Program m = Instruction (m ()) (Program m) | Control (m (Program m)) ...

16得票1回答
Data.Map实现中的Bug?

我碰到了一件事情,我猜想是在Data.Map中的一个bug,但也很有可能是我Haskell知识方面的问题。希望有人能澄清这是哪个问题 :) 请参考此处的代码片段。我正在将一个循环链表结构序列化为字节流。对于任何给定的节点,形式为:data Node = Node { val :: Wo...

16得票4回答
懒惰的绑定方式用于一维动态规划

几年前我上了一个算法课,在那里我们得到了以下问题(或类似的问题): 有一栋有 n 层楼的建筑,有一台电梯每次只能上2层楼,下3层楼。使用动态规划编写一个函数,计算电梯从第 i 层到第 j 层所需步数。 显然,使用状态化方法很容易解决这个问题,您可以创建一个 n 元素长度的数组并将其...

12得票1回答
在Scala中使用letrec?(一种不可变的“打结”方式?)

假设我有一个非常简单的case类,像这样: case class Foo(name: String, other: Foo) 我该如何定义a和b,使得a.other等于b,b.other等于a,并且这两个变量是不可变的?Scala是否提供了类似于"tying the knot"的方法?我...

11得票1回答
如何恢复足够的懒惰来在一个单子中打结的任何方法?(注:此问题涉及IT技术中的函数式编程概念,需要一定专业背景知识才能理解)

我想要写一段简洁的代码(否则需要花费很多时间实现),通过tying the knot来完成。大致上就是这样:n <- myinstr n x 理论上,myinstr应该运行x并得到一个值,这个值会变成n。 myinstr在State单子中运行,将把n放入状态中,但这不会影响x的计算。 ...

11得票1回答
调试不需要的严格性?

我有一个问题,不知道该如何理解。我原本想问是否有人能帮我解决具体问题,但我突然想到可以提出一个更一般的问题,希望能从中获得更好的一般性理解。所以问题来了: 通常,如果您的程序太懒了,那么很明显会出现问题,例如空间泄漏等引人注目的问题。我遇到的问题相反:我的程序过于严格。我正在尝试绑定节点,并...

10得票1回答
用具有良好类型化错误处理的相互递归ADT打结

(说明:本篇文章是一个Literate Haskell文件,您可以将其复制粘贴到文本缓冲区中,另存为 someFile.lhs ,然后使用ghc运行它。) 问题描述:我想创建一个包含两种不同节点类型的图,这两种类型相互引用。下面的示例非常简化。两个数据类型A和B在这里几乎是相同的,但在原始程...

8得票3回答
为什么Prelude中的`iterate`函数没有实现循环引用优化?

为什么iterate没有像这样定义: iterate :: (a -> a) -> a -> [a] iterate f x = xs where xs = x : map f xs 在Prelude中?