2016-09-24 10 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 
;; 

最初の引数は関数であり、第二は返すようにデフォルト値である入力リストが空で、そして3番目の引数はリスト自体であればとき/ 。

意図したとおり、この関数は、私は例えば、別の関数を使用して、それを呼び出すようにしようとする場合を除き、作品:関数として渡します

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の関数を渡したいとします。言い換えると、2つの異なるタイプが必要です。 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