1

在不返回列表的情况下在列表中插入元素的最佳方法是什么?当我尝试使用 operator::时,它返回一个列表:

element :: lst

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

4

1 回答 1

1

你想做的事不能做,因为列表是不可更改的。

它们是不可更改的,因为这“完全不是”你在函数式编程中做事的方式。您将原始列表提供给一个函数并获得一个新列表。如果列表对某些事情有好处,那么您将继续努力。

但是有希望:您可以使用参考。来自交互式会话的代码:

# 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 = ()
#

代码步行:

  • 定义我的列表
  • 尝试访问列表中的一个元素,这是不可能的
  • 另一个尝试访问一个元素,不行。您必须能够访问它以存储新值
  • 列表迭代以打印列表的示例
  • 创建 '_a list ref 类型的引用 r
  • 在 r 中存储字符串和 mylist
  • 在 r 中迭代列表以进行打印,以查看数据是否存在
  • 使用列表的动态更改迭代列表
  • 最后用 Caml 语法给出 List.iteri 的(差)示例

我之所以这么明确,是因为我在尝试熟悉 FP 时完全错过了这些示例。

/STR。

于 2013-03-31T16:08:53.667 回答