2011-01-13 103 views
4

我需要一個函數,每次迭代都遞歸地返回(不打印)列表中的所有值。但是,每次我嘗試編程時,我的函數都會返回一個列表。返回列表中的所有值的遞歸函數(在OCaml中)

let rec elements list = match list with 
| [] -> [] 
| h::t -> h; elements t;; 

我需要使用它在我寫的另一個函數返回的每一次每一個元素,所以我需要在同一時間這些元素之一,但我不知道這部分了。任何幫助,將不勝感激。

回答

3

你的功能等同於:

let rec elements list = 
    match list with 
    | [] -> [] 
    | h :: t -> elements t 

這是因爲a ; b評估a(和丟棄結果),然後計算並返回b。很明顯,這又相當於:

let elements (list : 'a list) = [] 

這不是一個非常有用的功能。

然而,在您嘗試解決此問題之前,請理解目標Caml函數只能返回一個值。返回多個價值是不可能的。

有辦法解決這個限制。一種解決方案是將所有希望返回的值打包成單個值:通常是元組或列表。所以,如果你需要返回元素的任意號碼,你就會把它們捆綁在一起成一個列表並調用代碼的過程,列出:

let my_function() = [ 1 ; 2; 3; 4 ] in (* Return four values *) 
List.iter print_int (my_function()) (* Print four values *) 

另一個不太常見的解決方案是提供的功能和調用它每個結果:

let my_function action = 
    action 1 ; 
    action 2 ; 
    action 3 ; 
    action 4 
in 
my_function print_int 

這是不太靈活,但可以說是速度更快,比返回一個列表:列出了可篩選,排序,存儲...

+0

謝謝你的迴應。我一直在考慮用兩個函數分兩步來完成,就像你所描述的那樣,但是我的問題是逐個檢索每個元素。我應該更具體些。我的主要功能是一個子集函數,在該函數中,我負責確定列表a是否是列表b的子集。我需要以一種多態的方式編寫這個函數,但現在我只能弄清楚如何用一個int列表來完成它。 – Atticus 2011-01-13 11:03:47

1

你的問題是怎麼樣的困惑 - 你想要的功能它返回列表中的所有值。那麼返回可變數量值的最簡單方法是使用一個列表!你是否試圖模仿Python生成器? OCaml沒有類似於yield的任何東西,而是通常通過將一個函數「傳遞」到該值(使用iter,foldmap)來實現相同。

當前已寫什麼就相當於這在Python:

def elements(list): 
    if(len(list) == 0): 
     return [] 
    else: 
     list[0] 
     return elements(list[1:]) 

如果你正在試圖做到這一點:

def elements(list): 
    if(len(list) > 0): 
     yield list[0] 
     # this part is pretty silly but elements returns a generator 
     for e in elements(list[1:]): 
      yield e 

for x in elements([1,2,3,4,5]): 
    dosomething(x) 

OCaml中的等價物會是這樣的:

List.iter dosomething [1;2;3;4;5] 

如果您試圖確定列表a是否是列表b的子集(正如我從您的評論),然後就可以採取的List.memList.for_all優點:

List.for_all (fun x -> List.mem x b) a 

fun x -> List.mem x b定義如果x的值等於在任意元素,則返回true(是)B的成員的功能。 List.for_all需要一個函數返回一個bool(在我們的例子中,我們剛纔定義的成員函數)和一個列表。它將該函數應用於列表中的每個元素。如果該函數對列表中的每個值返回true,則for_all返回true。

所以我們所做的是:對於a中的所有元素,檢查它們是否是b的成員。如果你對如何自己編寫這些函數感興趣,那麼我建議閱讀list.ml的源文件(假設* nix)可能位於/ usr/local/lib/ocaml或/ usr/lib/ocaml中。