在 Ocaml 列表中插入元组
Inserting tuples in a list Ocaml
我已经声明了一个列表 l=[];;现在尝试使用“@”将元组附加到此列表中。但我不能这样做。谁能帮我解决这个问题。
let l = []
for x = 1 to 10 do
l <- l@[(x,x+10)]
done;;
并希望最终答案为:l=[(1,10),(2,20),(3,30).....]
您对 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,学习使用不可变值可能会更好。
更新
这里有一些关于编写递归函数的提示。我不想通过为您编写代码来破坏练习。
递归解决问题的方法是回答这样的问题:
我要解决什么一般性问题?在您的情况下,您正在尝试创建具有某些算术属性的一定长度的对列表。
这个问题最简单的情况是什么?在您的情况下,最简单的情况是所需长度为 0(在这种情况下列表为空)。
如果我有一个非平凡的问题案例,我怎样才能将它分解成易于计算的答案和同一问题的较小案例?你想 assemble 这些变成完整的答案。在您的情况下,较小的部分将是结果的第一个元素(易于计算),并且列表更短(同一问题的较小情况)。
然后你的代码对于具有一些参数(比如 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>>
我已经声明了一个列表 l=[];;现在尝试使用“@”将元组附加到此列表中。但我不能这样做。谁能帮我解决这个问题。
let l = []
for x = 1 to 10 do
l <- l@[(x,x+10)]
done;;
并希望最终答案为:l=[(1,10),(2,20),(3,30).....]
您对 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,学习使用不可变值可能会更好。
更新
这里有一些关于编写递归函数的提示。我不想通过为您编写代码来破坏练习。
递归解决问题的方法是回答这样的问题:
我要解决什么一般性问题?在您的情况下,您正在尝试创建具有某些算术属性的一定长度的对列表。
这个问题最简单的情况是什么?在您的情况下,最简单的情况是所需长度为 0(在这种情况下列表为空)。
如果我有一个非平凡的问题案例,我怎样才能将它分解成易于计算的答案和同一问题的较小案例?你想 assemble 这些变成完整的答案。在您的情况下,较小的部分将是结果的第一个元素(易于计算),并且列表更短(同一问题的较小情况)。
然后你的代码对于具有一些参数(比如 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>>