2015-03-14 2 views
0

У меня есть задание, которое требует написания кода в список накидной без использования каких-либо функций библиотеки это мой кодобъединение списка в OCaml без использования библиотеки

let rec union (l1:'a list) (l2:'a list) = 
    let rec f x l = match l with 
    | [] -> true 
    | hd::tl -> 
     if x = hd then false else f x tl 
    in 
    match l2 with 
    | [] -> l1 
    | hd::tl -> 
    if f hd l1 then 
     union hd::l1 tl 
    else 
     union l1 tl 

но компилятор говорит, что «Это выражение имеет тип 'a, но ожидалось выражение типа' list Тип переменной 'a встречается внутри' списка

Может ли кто-нибудь помочь мне выяснить, где я сделал ошибку? спасибо

ответ

3

Я думаю, вам просто нужно несколько круглых скобок на последней строке:

if f hd l1 then union (hd::l1) tl else union l1 tl 

В OCaml функции приложения (как в f x) имеет очень высокий приоритет. Таким образом, без этих parens выражение интерпретируется как (union hd) :: (l1 tl).

(Этот код очень хорошо. Может быть, переименовывать f к чему-то более описательный, таких как notmem.)

+0

Спасибо иа много! Оказывается, я забыл круглые скобки, я думал, Ocaml может интерпретировать его автоматически, не знал, что он настолько чувствителен. –

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