列表

时间:2016-09-24 01:40:39

标签: 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 个答案:

答案 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>