List 在列表Ocaml中插入元组

List 在列表Ocaml中插入元组,list,tuples,ocaml,concatenation,List,Tuples,Ocaml,Concatenation,我已经声明了一个列表l=[];;现在尝试使用“@”将元组附加到此列表中。但我不能这样做。谁能帮我整理一下吗 let l = [] for x = 1 to 10 do l <- l@[(x,x+10)] done;; 让l=[] 对于x=1到10 do l你对l的定义意味着l是不可变的。您将其值定义为[],并且此值永远无法更改 如果希望能够更改l,则需要将其定义为可变值。一种简单的方法是将其设置为“ref”: 在此之后,您可以使用获取l的值运算符并使用:=运算符更改值: # !l

我已经声明了一个列表l=[];;现在尝试使用“@”将元组附加到此列表中。但我不能这样做。谁能帮我整理一下吗

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

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

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

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

# !l;;
- : '_a list = []
# l := !l @ [3];;
- : unit = ()
# !l;;
- : int list = [3]
但是,此代码不是惯用的OCaml。如果您在学术上学习OCaml,那么最好学习使用不可变值

更新

下面是一些编写递归函数的提示。我不想因为给你写代码而破坏练习

递归解决问题的方法是回答以下问题:

  • 我要解决的一般问题是什么?在您的例子中,您试图创建一个具有一些算术属性的长度对的列表

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

  • 如果我有一个非琐碎的问题,我怎么能把它分成容易计算的答案和同一个问题的小案例?你想把这些组合成完整的答案。在您的例子中,较小的部分将是结果的第一个元素(易于计算),并且是一个较短的列表(相同问题的较小部分)

  • 然后,对于带有一些参数(例如a、b、c、d)的花园式递归函数,您的代码如下所示:

    让rec f a b c d=
    若然
    其他的
    让tp=in
    让(a',b',c',d')=in
    设smres=fa'b'c'd'in
    
    你对
    l
    的定义意味着
    l
    是不可变的。您将其值定义为
    []
    ,并且此值永远无法更改

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

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

    # !l;;
    - : '_a list = []
    # l := !l @ [3];;
    - : unit = ()
    # !l;;
    - : int list = [3]
    
    但是,此代码不是惯用的OCaml。如果您在学术上学习OCaml,那么最好学习使用不可变值

    更新

    下面是一些编写递归函数的提示。我不想因为给你写代码而破坏练习

    递归解决问题的方法是回答以下问题:

  • 我要解决的一般问题是什么?在您的例子中,您试图创建一个具有一些算术属性的长度对的列表

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

  • 如果我有一个非琐碎的问题,我怎么能把它分成容易计算的答案和同一个问题的小案例?你想把这些组合成完整的答案。在您的例子中,较小的部分将是结果的第一个元素(易于计算),并且是一个较短的列表(相同问题的较小部分)

  • 然后,对于带有一些参数(例如a、b、c、d)的花园式递归函数,您的代码如下所示:

    让rec f a b c d=
    若然
    其他的
    让tp=in
    让(a',b',c',d')=in
    设smres=fa'b'c'd'in
    
    你对
    l
    的定义意味着
    l
    是不可变的。您将其值定义为
    []
    ,并且此值永远无法更改

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

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

    # !l;;
    - : '_a list = []
    # l := !l @ [3];;
    - : unit = ()
    # !l;;
    - : int list = [3]
    
    但是,此代码不是惯用的OCaml。如果您在学术上学习OCaml,那么最好学习使用不可变值

    更新

    下面是一些编写递归函数的提示。我不想因为给你写代码而破坏练习

    递归解决问题的方法是回答以下问题:

  • 我要解决的一般问题是什么?在您的例子中,您试图创建一个具有一些算术属性的长度对的列表

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

  • 如果我有一个非琐碎的问题,我怎么能把它分成容易计算的答案和同一个问题的小案例?你想把这些组合成完整的答案。在您的例子中,较小的部分将是结果的第一个元素(易于计算),并且是一个较短的列表(相同问题的较小部分)

  • 然后,对于带有一些参数(例如a、b、c、d)的花园式递归函数,您的代码如下所示:

    让rec f a b c d=
    若然
    其他的
    让tp=in
    让(a',b',c',d')=in
    设smres=fa'b'c'd'in
    
    你对
    l
    的定义意味着
    l
    是不可变的。您将其值定义为
    []
    ,并且此值永远无法更改

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

    在这之后你可以得到t