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

Смежные вопросы