在列表Ocaml中插入元组

时间:2015-04-26 05:46:18

标签: list tuples ocaml concatenation

我已经声明了一个列表l = [] ;;现在尝试使用' @'将元组附加到此列表中。但我无法这样做。任何人都可以帮我解决这个问题。

let l = []
for x = 1 to 10 do
  l <- l@[(x,x+10)]
  done;;

并希望最终答案为:l = [(1,10),(2,20),(3,30).....]

1 个答案:

答案 0 :(得分:3)

您对l的定义意味着l是不可变的。您将其值定义为[],并且永远不会更改。

如果您希望能够更改l,则需要将其定义为可变值。一种简单的方法是将其作为&#34; ref&#34;:

# let l = ref [];;
val l : '_a list ref = {contents = []}

在此之后,您可以使用l运算符获取!的值,并使用:=运算符更改值:

# !l;;
- : '_a list = []
# l := !l @ [3];;
- : unit = ()
# !l;;
- : int list = [3]

但是,这段代码不是惯用的OCaml。如果您在学术上学习OCaml,那么学习使用不可变值可能会更好。

<强>更新

以下是编写递归函数的一些提示。我不想通过为您编写代码来破坏练习。

递归地解决问题的方法是回答这样的问题:

  1. 我想解决的一般问题是什么?在您的情况下,您尝试使用某些算术属性创建一些长度对的列表。

  2. 这个问题最简单的例子是什么?在您的情况下,最简单的情况是当所需长度为0时(在这种情况下列表为空)。

  3. 如果我有一个问题的非繁琐案例,我怎样才能将其分解为容易计算的答案和相同问题的小案例?您想将这些组合成完整的答案。在您的情况下,较小的部分将是结果的第一个元素(容易计算),以及一个较短的部分(相同问题的较小情况)。

  4. 然后你的代码对于具有一些参数(例如a,b,c,d)的花园种类递归函数看起来像这样:

    let rec f a b c d =
        if <<this is the trivial case>> then
            <<the answer is obvious>>
        else
            let tp = <<answer to tiny piece of the problem>> in
            let (a', b', c', d') = <<rest of the problem (smaller)>> in
            let smres = f a' b' c' d' in
            <<combine tp and smres>>