Предположим, я хочу определить функцию f
в терминах некоторой другой предопределенной функции g
следующим образом:
f :: Int -> Int -> Int
f 2 b = g b
f _ _ = 1
То есть я хочу определить проекцию, f(2,_) : Int->Int
будет такой же, как g(_) : Int->Int
. К счастью, в Haskell есть функции первого класса, и поэтому определения, подобные следующему squarePlusOne
, являются действительными и стандартными:
plusOne :: Int -> Int
plusOne i = i+1
square :: Int -> Int
square i = i*i
squarePlusOne :: Int -> Int
squarePlusOne = plusOne . Square
С карри в Haskell (т.е. f
принимает только один Int
в качестве ввода и возвращает типизированную функцию (Int->Int)
), я удивлен, что не могу написать
f 2 = g
Почему бы и нет? Или есть какой-то другой синтаксис?