Haskell - быстрое именование проекционных функций - PullRequest
0 голосов
/ 05 апреля 2019

Предположим, я хочу определить функцию 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

Почему бы и нет? Или есть какой-то другой синтаксис?

Ответы [ 2 ]

4 голосов
/ 05 апреля 2019

Действительно, запись f 2 = g - это правильный способ определения f.Однако при определении функций таким образом помните, что вы должны определить всю функцию с одной и той же сигнатурой шаблона.То есть вы не можете исчерпать свою функцию, написав

f 2 = g
f i j = i+j

Вместо этого это может быть достигнуто так:

f 2 = g
f i = (\j-> i+j)
2 голосов
/ 05 апреля 2019

Вы можете использовать функцию const, которая создает функцию, которая игнорирует свой аргумент для возврата фиксированного значения.

f :: Int -> Int -> Int
f 2 = g            -- f 2 x = g x
f _ = const 1      -- f _ x = const 1 x == (\_ -> 1) x == 1
...