Я новичок в 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
Так мне интересно, что случилось с моим кодом?
Является ли «ограничение ценности» тем же, что и «ограничение мономорфизма» в Haskell? –
Нет, это другое ограничение. Haskell не нуждается в ограничении значения, потому что у него нет «побочных эффектов». –