F#编程插入功能?

时间:2018-10-21 02:31:40

标签: f#

我正在尝试实现一个应使用<依次插入的函数,如果x存在于S中,则S不变地返回。我在下面编写的代码未按预期输出。如果我有一个集合S = [2; 4]和x = [4; 6]。预期输出应为 [2; 4; 6]下面的代码输出[2; 4; 7]。感谢您提供任何解决此问题的帮助。谢谢。

let rec insert x S =
    match S with
    |[] -> x
    |e::rest -> e::(insert S rest)

2 个答案:

答案 0 :(得分:0)

我有一些建议可以帮助您进行编程:

  • 保持一致。您可以从命名约定开始:小写的x和大写的S,这令人困惑。
  • 使用对您有意义的名称。即使它们变得太长,您也可以稍后将其缩短。在最后一行中,您分别在insertS上调用rest,但是restS的一部分,因此没有任何意义。如果清楚的是什么,那您肯定会发现错误。
  • 在多个位置撒上printfn,以便您可以实际看到正在发生的事情。这样一来,您可以自己解决问题。

我正在按照我上面提出的建议重写您的代码。注意,我不只是更改变量名称的代码,而是添加一些printfn

let rec addToOrderedList orderedList listToBeAdded =
    printfn "addToOrderedList %A %A" orderedList listToBeAdded 
    match listToBeAdded with
    | []                        -> printfn "nothing to add, finishing"
                                   orderedList 
    | elem::restOfListToBeAdded -> printfn "adding element %A" elem
                                   elem::(addToOrderedList listToBeAdded restOfListToBeAdded)

在最后一条指令中注意递归调用addToOrderedList listToBeAdded restOfListToBeAdded。现在很明显,您正在尝试将restOfListToBeAdded添加到listToBeAdded中,这是不正确的。

实施中还有其他问题,但是我将让您自己解决,这是学习过程的一部分。提示:没有<

答案 1 :(得分:0)

您应该看看Set<'a> type。 Set模块提供了一个Set.union函数(或+运算符),它可以实现您想要的目标。

let insert lst1 lst2 =
    Set.ofList lst1 + Set.ofList lst2
    |> Set.toList