在列表Ocaml中插入元组

巴津加

我已经声明了一个列表l = [] ;; 现在尝试使用“ @”将元组追加到此列表中。但是我不能这样做。谁能帮我解决这个问题。

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

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

杰弗里·斯科菲尔德(Jeffrey Scofield)

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

如果希望能够进行更改l,则需要将其定义为可变值。一种简单的方法是使其成为“ ref”:

# 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. 如果我有一个非普通的问题案例,如何将其分解为易于计算的答案和较小的相同问题案例?您想将它们组合成完整的答案。在您的情况下,较小的部分将是结果的第一个元素(易于计算),而列表则要短一些(相同问题的较小情况)。

然后,对于带有多个参数(例如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>>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章