我想编写一个函数,它将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 =...
并且可行,但我想用显式类型声明该函数。
我在做什么的帮助或指导不正确?
答案 0 :(得分: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>