2013-03-28 102 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