2016-09-24 103 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