2016-09-24 136 views
0

我想編寫一個函數,它將組合OCaml中列表中的所有元素。夠簡單了,到目前爲止,我有一個工作功能:列表OCaml類型錯誤

let rec comAll (f : 'a -> 'a -> 'a) (r : 'a) (l : 'a list) : 'a = 
    match l with [] -> r 
    | hd::tl -> let comAll2 = comAll f r tl in f hd comAll2 
;; 

的第一個參數是一個函數,第二個是一個默認值返回時/如果輸入列表是空的,而第三個參數是列表本身。

此功能按預期工作,除了當我嘗試調用它使用其他功能,例如:

let inList (l : 'a list) (e : 'a) : bool = comAll (fun x y -> if x == e then true else y) false l ;; 

將通過一個函數,返回inList : bool list -> bool -> bool = <fun>不過,我想,而不是使其返回inList : 'a list -> 'a -> bool = <fun>

我試着改爲將comAll定義爲:let rec comAll f r l =...,那可行,但我想用明確的類型聲明該函數。

任何幫助或指導我在做什麼不正確在這裏?

回答

1

您正在聲明您的參數f的類型爲'a -> 'a -> 'a,但您想要傳遞類型爲'a -> bool -> bool的函數。換句話說,你想有兩種不同的類型。您應該聲明f的類型爲'a -> 'b -> 'b。其餘的將隨之而來。

# let rec comAll (f : 'a -> 'b -> 'b) (r : 'b) (l : 'a list) : 'b = 
    match l with [] -> r 
    | hd::tl -> let comAll2 = comAll f r tl in f hd comAll2 ;; 
val comAll : ('a -> 'b -> 'b) -> 'b -> 'a list -> 'b = <fun> 
# let inList (l : 'a list) (e : 'a) : bool = 
     comAll (fun x y -> if x == e then true else y) false l;; 
val inList : 'a list -> 'a -> bool = <fun> 
+0

好的,但爲了我正在工作的目的,是否有辦法讓它使用'a - >'a - >'a'? – Jeremy

+0

不,沒有。你想傳遞一個不是''a - >'a - >'a'類型的函數。 –

+0

好的。謝謝您的幫助。我想我現在已經掌握了它 – Jeremy