我需要一個函數,每次迭代都遞歸地返回(不打印)列表中的所有值。但是,每次我嘗試編程時,我的函數都會返回一個列表。返回列表中的所有值的遞歸函數(在OCaml中)
let rec elements list = match list with
| [] -> []
| h::t -> h; elements t;;
我需要使用它在我寫的另一個函數返回的每一次每一個元素,所以我需要在同一時間這些元素之一,但我不知道這部分了。任何幫助,將不勝感激。
我需要一個函數,每次迭代都遞歸地返回(不打印)列表中的所有值。但是,每次我嘗試編程時,我的函數都會返回一個列表。返回列表中的所有值的遞歸函數(在OCaml中)
let rec elements list = match list with
| [] -> []
| h::t -> h; elements t;;
我需要使用它在我寫的另一個函數返回的每一次每一個元素,所以我需要在同一時間這些元素之一,但我不知道這部分了。任何幫助,將不勝感激。
你的功能等同於:
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
這是不太靈活,但可以說是速度更快,比返回一個列表:列出了可篩選,排序,存儲...
你的問題是怎麼樣的困惑 - 你想要的功能它返回列表中的所有值。那麼返回可變數量值的最簡單方法是使用一個列表!你是否試圖模仿Python生成器? OCaml沒有類似於yield
的任何東西,而是通常通過將一個函數「傳遞」到該值(使用iter
,fold
或map
)來實現相同。
當前已寫什麼就相當於這在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.mem
和List.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中。
謝謝你的迴應。我一直在考慮用兩個函數分兩步來完成,就像你所描述的那樣,但是我的問題是逐個檢索每個元素。我應該更具體些。我的主要功能是一個子集函數,在該函數中,我負責確定列表a是否是列表b的子集。我需要以一種多態的方式編寫這個函數,但現在我只能弄清楚如何用一個int列表來完成它。 – Atticus 2011-01-13 11:03:47