2013-01-16 59 views
1

我寫了一個函數,該函數將所有元素從給定的清單:List.fold_left OCaml中

let rec add = function []->0 | h::t->h+add(t);;

現在我想寫相同的功能,但使用List.fold_left,但是我試了幾個變化,但我仍然有錯誤。首先,我想這:

let rec add = function []->0 | h::t-> add List.fold_left((fun h t-> h+t) h t);;

但我有一個錯誤,我注意到List.fold_left所以遞歸是不必要返回一個int值。所以我改變了:

let add = function []->0 | h::t -> List.fold_left (fun h t-> h+t h t);;

但我仍然得到關於錯誤的類型的錯誤: Error: This expression has type int -> 'a -> 'b but an expression was expected of type 'a 但我不知道如何解決這個問題,任何人可以解釋我如何在這個例子中使用List.fold_left

回答

11

fold_left在列表上運行,與函數一樣,通過應用函數並以特定方式累加結果。它負責爲你遞歸遞歸。它處理列表的結構,因此您可以處理如何以特定方式組合列表中的元素。因此,您需要找出您想要應用於fold_left的高階函數,該函數以相同的方式在列表上運行。

例如,這裏有兩種方法來獲取列表的最大元素,...

let rec max_list smallest lst = match lst with 
    | [] -> smallest 
    | h::t -> max_list (max smallest h) t 

let max_list smallest lst = 
    List.fold_left (fun acc x -> max acc x) smallest lst 

你會注意到的功能某些方面的相似性;基本情況(最小)以及如何組合元素(使用函數max)。你應該在你的函數中看到相同的相似性。

回首你的最終落實,

let add = function | []->0 
        | h::t -> List.fold_left (fun h t-> h+t h t) 

這裏的問題是,你有一個錯位的括號...

let add = function | []->0 
        | h::t -> List.fold_left (fun h t-> h+t) h t 

但是,這可以被簡化,類似於上面我舉的例子。

4

一種方式加起來的整數列表:

# List.fold_left (+) 0 [1; 3; 5; 7];; 
- : int = 16 
2

如果使用Core.Std,都需要例如命名參數,

List.fold_left ~f:(+) ~init:0 [1; 3; 5; 7];; 
- : int = 16