List 如何在不返回列表的情况下将元素添加到列表中?

List 如何在不返回列表的情况下将元素添加到列表中?,list,functional-programming,ocaml,List,Functional Programming,Ocaml,在列表中插入元素而不返回列表的最佳方法是什么?当我尝试使用操作符:时,它会返回一个列表: element :: lst 但是,我希望返回值为单位,类似于Hashtbl.add的工作方式。您想做的事情无法完成,因为列表是不可更改的 它们是不可更改的,因为这“完全不是”函数式编程中的操作方式。将原始列表提供给函数,然后获得新列表。如果这份清单对某件事有好处,你就继续努力吧 但还是有希望的:你可以参考一下。来自交互式会话的代码: # let mylist = ["one";"two";"tree"]

在列表中插入元素而不返回列表的最佳方法是什么?当我尝试使用操作符
时,它会返回一个列表:

element :: lst

但是,我希望返回值为单位,类似于Hashtbl.add的工作方式。

您想做的事情无法完成,因为列表是不可更改的

它们是不可更改的,因为这“完全不是”函数式编程中的操作方式。将原始列表提供给函数,然后获得新列表。如果这份清单对某件事有好处,你就继续努力吧

但还是有希望的:你可以参考一下。来自交互式会话的代码:

# let mylist = ["one";"two";"tree"] ;;
val mylist : string list = ["one"; "two"; "tree"]
#  mylist.[1];;
Error: This expression has type string list
       but an expression was expected of type string
#  mylist.(1);;
Error: This expression has type string list
   but an expression was expected of type 'a array
# List.iter (function e -> print_endline e) mylist;;
one
two
tree
- : unit = ()
# let r = ref [];;
val r : '_a list ref = {contents = []}
# r := "zero" :: mylist;;
- : unit = ()
# List.iter (function e -> print_endline e) !r;;
zero
one
two
tree
- : unit = ()
# List.iter (function e -> print_endline e) ("minus" :: !r);;
minus
zero
one
two
tree
- : unit = ()
# List.iteri (fun cnt -> fun e -> Printf.printf "Element %d: %s" cnt e) !r;;
Element 0: zeroElement 1: oneElement 2: twoElement 3: tree- : unit = ()
#
代码漫游:

  • 定义mylist
  • 尝试访问列表中的一个元素,这是不可能的
  • 另一次尝试访问一个元素,不允许。您必须能够访问它以存储新值
  • 打印列表的列表迭代示例
  • 创建类型为“”的引用r\u列表引用
  • 在r中存储字符串和mylist
  • 在r中迭代列表以进行打印,查看数据是否存在
  • 使用列表的即时更改迭代列表
  • 最后以Caml语法给出List.iteri的一个(糟糕的)示例
我之所以如此明确,是因为我在尝试使用FP时遗漏了这些例子


/Str.

您想做的事情无法完成,因为列表是不可更改的

它们是不可更改的,因为这“完全不是”函数式编程中的操作方式。将原始列表提供给函数,然后获得新列表。如果这份清单对某件事有好处,你就继续努力吧

但还是有希望的:你可以参考一下。来自交互式会话的代码:

# let mylist = ["one";"two";"tree"] ;;
val mylist : string list = ["one"; "two"; "tree"]
#  mylist.[1];;
Error: This expression has type string list
       but an expression was expected of type string
#  mylist.(1);;
Error: This expression has type string list
   but an expression was expected of type 'a array
# List.iter (function e -> print_endline e) mylist;;
one
two
tree
- : unit = ()
# let r = ref [];;
val r : '_a list ref = {contents = []}
# r := "zero" :: mylist;;
- : unit = ()
# List.iter (function e -> print_endline e) !r;;
zero
one
two
tree
- : unit = ()
# List.iter (function e -> print_endline e) ("minus" :: !r);;
minus
zero
one
two
tree
- : unit = ()
# List.iteri (fun cnt -> fun e -> Printf.printf "Element %d: %s" cnt e) !r;;
Element 0: zeroElement 1: oneElement 2: twoElement 3: tree- : unit = ()
#
代码漫游:

  • 定义mylist
  • 尝试访问列表中的一个元素,这是不可能的
  • 另一次尝试访问一个元素,不允许。您必须能够访问它以存储新值
  • 打印列表的列表迭代示例
  • 创建类型为“”的引用r\u列表引用
  • 在r中存储字符串和mylist
  • 在r中迭代列表以进行打印,查看数据是否存在
  • 使用列表的即时更改迭代列表
  • 最后用Caml语法给出List.iteri的一个(糟糕的)示例
我之所以如此明确,是因为我在尝试使用FP时遗漏了这些例子


/Str.

这被称为“可变列表”,谢天谢地,标准列表是无法改变的——这是一种“函数式编程”思想;-)查看并搜索“mutable”-您将找到关于数组之类的话题。因此,如果我将列表声明为mutable,我可以这样做:mytype.list列表不能声明为mutable。但是你可以将一个(新的)列表分配给一个
mutable
变量(或
ref
slot)-请记住它是一个不同的列表。这被称为“mutable list”,谢天谢地,人们不能改变标准列表-这是一种“函数式编程”思想;-)查看并搜索“mutable”-您将找到关于数组之类的话题。因此,如果我将列表声明为mutable,我可以这样做:mytype.list列表不能声明为mutable。但是您可以将一个(新)列表分配给一个
mutable
变量(或
ref
slot)-请记住它是一个不同的列表。在上一个示例中,caml语法函数应该是:fun cnt e->,因为多个参数是“fun”的caml特性定义。在上一个示例中,caml语法函数应该是:fun cnt e->,因为多个参数是“fun”定义的caml特性。