2013-03-28 109 views
1

在列表中插入元素而不返回元素列表的最佳方式是什么?因为下面的这些运算符返回一个列表:如何在列表中添加元素而不返回列表?

element :: lst 

我想单位返回,就像Hashtbl.add函数一样。谢谢。

+2

这被称为“可变列表”,一个*不能*突变标准列表,幸运的是 - 这是那些“函数式编程”的意识形态之一;-)请参阅http://caml.inria.fr/pub/ docs/fpcl/fpcl-07.pdf和http://caml.inria.fr/pub/docs/manual-ocaml-4.00/manual003.html,搜索“可变” - 你会发现有关数组等的讨论。 – 2013-03-28 01:06:58

+0

所以如果我声明我的列表是可变的,我可以这样做:mytype.list < - element :: mytype.list? – 2013-03-28 01:19:04

+2

列表不能被声明为可变。但是,您可以将一个(新)列表分配给一个'mutable'变量(或'ref' slot) - 请记住它是一个不同的列表。 – 2013-03-28 01:22:16

回答

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

代码走查:

  • 定义MYLIST
  • 尝试列表访问一个元素,不可能
  • 另一个试图访问一个元素,不走。你必须能够访问它来存储一个新的值列表进行迭代的
  • 例如打印列表
  • 创建类型_a列表裁判
  • 存储串和MYLIST r中
  • 迭代列表中的”附图标记R r表示印刷,看数据是否存在
  • 迭代列表与列表的飞行变化
  • 最后给List.iteri的(差)例如,在CAML语法

我非常明确,因为我在尝试使用FP进行染色时完全错过了这些示例。

/Str。

+0

在最后一个示例中,caml语法函数应该是:fun cnt e - >,因为多个参数是“有趣”定义的Caml特性。 – 2013-04-03 22:31:55