2013-10-10 5 views
0

Я новичок в OCaml и пытаюсь написать некоторые основные функции.Что случилось с моей реализацией «curry2»?

Я нашел функцию find_new (эта функция в основном находит список элементов, которые отображаются только в первом списке) не работает, если я использую curry2 для ее определения.

let curry2 f (x,y) = f x y 

let flip f x y = f y x 

let compose f g x = g (f x) 
let rec elem v xs = match xs with 
     [] -> false 
     | (h::t) -> if v = h then true else elem v t 

let rec filter fb l = match l with 
    [] -> [] 
    | (h::t) -> if fb h 
       then h::(filter fb t) 
       else (filter fb t) 

let x = [5;6;7;3] ;; 
let y = [5;6;7;5] ;; 
let z = [7;5;6;5] ;; 
let a = [3;5;8;9] ;; 

let find_new_ xs ys = filter (compose ((flip elem) ys) not) xs ;; 
let find_new (xs,ys) = find_new_ xs ys;; (* works *) 
(* let find_new = curry2 find_new_;; *) (* doesn't work *) 

find_new (x,[3]);; 
find_new (x,[3;5]);; 
find_new (x,[3;6]);; 
find_new ([x;y;z],[y]);; 
find_new ([x;y;z],[y;x]);; 

, если я использую второе определение find_new (тот, который закомментированного), информация об ошибке была:

Error: This expression has type int list 
     but an expression was expected of type int 

Так мне интересно, что случилось с моим кодом?

ответ

3

Это похоже на ограничение значения. Попробуйте определения с расширением эты

let find_new pair = curry2 find_new_ pair 

Смотрите OCaml FAQ A function obtained through partial application is not polymorphic enough.

+0

Является ли «ограничение ценности» тем же, что и «ограничение мономорфизма» в Haskell? –

+0

Нет, это другое ограничение. Haskell не нуждается в ограничении значения, потому что у него нет «побочных эффектов». –

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