我们正在从用于生成排列的功能程序(Topor,1982)中实现算法A的put
部分。这是我们的实施。它通过了初步测试。
// constructively puts a in to p immediately before q
let rec put (a: 't) (p: List<'t>) (q: 't) : List<'t> =
if p.Head = q then a :: p
else p.Head :: put a p.Tail q
我们的实施似乎与文章的建议实施不同。
put (a, p, q) =
if p = q then a : q
else (hd p) : put(a, tl p, q)
我所关注的是then a :: p
与文章then a : q
之间的差异。也就是说,该文章使用q
。这似乎是不正确的。我错过了什么或文章中有错误吗?
以下是文章中的相关摘录。
W上。托波尔,罗德尼。 (1982年)。用于生成排列的功能程序。 COMPUT。 J .. 25. 257-263。 10.1093 / comjnl / 25.2.257。
答案 0 :(得分:2)
在书中描述的示例中,q
是(子)列表。在您的实现中,它看起来像一个标量。
答案 1 :(得分:2)
我所关注的是
a :: p
与文章然后a : q
的区别。也就是说,该文章使用q
。这似乎是不正确的。我错过了什么或文章中有错误吗?
从这个分支开始,我们有p = q
,它们应该是可以互换的。
我认为虽然您错误解释了put
中的类型,但它们应该是:
let rec put (a: 't) (p: List<'t>) (q: List<'t>) : List<'t> = ...