52得票2回答
为什么在Haskell中使用差分列表比常规连接更有效?

我目前正在在线阅读《Haskell趣学指南》一书,已经到了一个章节,作者在解释一些列表连接可能效率低下的情况。例如:((((a ++ b) ++ c) ++ d) ++ e) ++ f 据说不太高效。作者提出的解决方案是使用“差分列表”,其定义为newtype DiffList a = Dif...

30得票7回答
在Prolog中展开一个列表

我只接触 Prolog 几天时间。虽然有些东西我已经理解了,但这个问题真的让我感到困惑。 我需要编写一个函数,接收一个列表并将其展平。?- flatten([a,[b,c],[[d],[],[e]]],Xs). Xs = [a,b,c,d,e]. ...

25得票6回答
如何在Prolog中原地向列表追加元素?

如果我在Prolog中有一个列表,例如X = [1, 2, 3, 4],我该如何将元素5添加到列表末尾,使得X = [1, 2, 3, 4, 5]? append函数需要两个列表,即append(A,B,C)将A和B连接到列表C。 我可以使用临时列表Y = [1, 2, 3, 4]和Z =...

20得票2回答
理解差异列表

我正在尝试理解Prolog中的差异列表,但是我很难正确地实现它,每次我尝试这样做时,我得到的是一个列表的列表,但那不是我想要的。我正在尝试实现一个追加谓词,但到目前为止运气不太好。我已经尝试了几次,但都没有成功。app(X, Y, Z) :- Z = [X|Y]. ?- app([a,b,c...

14得票2回答
Haskell: 扁平化二叉树

我在考虑将二叉树展平为一个列表,以便进行后续处理。 我最初想到使用 (++) 将左右分支连接起来,但是后来想到在最坏情况下这将花费 O(n^2) 的时间。 然后我想到倒序构建列表,在常数时间内使用 (:) 在前面附加。然而,我又想如果我将此列表发送给类似于fold的函数,则必须等待整个树被...

10得票2回答
为什么差异列表不是可折叠类型的实例?

dlist包 包含了 DList 数据类型,它有很多的实例,但没有 Foldable 或者 Traversable。在我看来,这两个类是最类似“列表”的类。是否有性能原因使得 DList 不是这些类的实例呢? 此外,该包确实实现了 foldr 和 unfoldr 但没有其他的折叠函数。

9得票4回答
这个问题是关于如何在Prolog中使用差分列表的上下文无关文法,它是如何工作的?

我正在阅读一篇关于Prolog中无上下文文法的教程,他们在页面底部提到可以使用差异列表在Prolog中实现无上下文文法,以下是包含代码块的内容: s(X,Z):- np(X,Y), vp(Y,Z). np(X,Z):- det(X,Y), n(Y,Z). vp(X,Z):- ...

9得票2回答
在Prolog中处理列表时,“-”符号代表什么意思?

我在阅读这个问题的答案。 p(X) :- read(A), q(A,X-[]). q(end,X-X) :- !. q(A,[A|X]-Y) :- read(B), q(B,X-Y). 上面的代码使用了语法List-List。我有点理解正在发生什么,但我想知道"-"符号/谓词在...

8得票3回答
"开放式列表"和"差异列表"的区别

“开放式列表”和“差异列表”有什么区别? 开放式列表是指可以动态添加元素的列表,而差异列表则是一种优化技术,可以在不重建列表的情况下高效地进行元素添加和删除操作。

7得票2回答
测试Prolog差分列表

我一直在阅读关于差异列表的好处,希望可以尝试一些书中的例子。但是似乎无法像append([1,2,3], [4,5], X)那样将列表作为输入传递,其中X=[1,2,3,4,5]。奇怪的是,我查阅的所有书籍都没有提到这一点。 我正在swipl上运行代码,有兴趣测试差异追加谓词: dapp(...