这如何使实现与q而不是p一起工作

时间:2018-01-30 17:13:04

标签: algorithm f# functional-programming

我们正在从用于生成排列的功能程序(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。这似乎是不正确的。我错过了什么或文章中有错误吗?

以下是文章中的相关摘录。

enter image description here

W上。托波尔,罗德尼。 (1982年)。用于生成排列的功能程序。 COMPUT。 J .. 25. 257-263。 10.1093 / comjnl / 25.2.257。

2 个答案:

答案 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> = ...