#function #haskell
#функция #haskell
Вопрос:
Полностью заблудитесь в следующем примере, который возвращает функцию
getAddFunc :: Int -> (Int -> Int)
getAddFunc x y = x y
adds3 = getAddFunc 3
fourPlus3 = adds3 4
сигнатура функции Int -> (Int -> Int)
сообщила мне, что она принимает Int
введенную функцию and Int -> Int
, и я очень смущен определением функции x y = x y
, похоже, что для этого потребовалось 2 целых числа x и y, а не только 1 целое число! Что здесь означают x и y? Я очень смущен.
Может ли кто-нибудь помочь мне с этим?
Комментарии:
1. имеет ли это больше смысла после прочтения этого ?
2. В этом прелесть haskell
3. @ShamPooSham просто начните это путешествие красоты на 40 минут 🙂
Ответ №1:
Вы смотрите на каррированную функцию. Код
getAddFunc x y = x y
эквивалентно
getAddFunc x = y -> x y
т.е. принимает x
в качестве аргумента и возвращает функцию y
.
Это также можно записать
getAddFunc = x -> y -> x y
или
getAddFunc = x y -> x y
В Haskell, с технической точки зрения, каждая функция принимает ровно один аргумент. Однако после принятия этого аргумента она может возвращать другую функцию, принимающую в качестве входных данных «второй» аргумент. Этот механизм также можно интерпретировать как функцию, принимающую «два» аргумента. Это дополнительно обобщается на N аргументов аналогичным образом.
Ответ №2:
Все функции в Haskell принимают один параметр. Действительно, функция:
getAddFunc x y = x y
эквивалентно:
getAddFunc x = y -> x y
и для:
getAddFunc = x -> y -> x y
Таким образом, вы создаете функцию, которая принимает параметр x
, и она сопоставляет его с функцией, которая принимает параметр y
и возвращает x y
.
Таким образом, это означает, что getAddFunc 42
это функция, которая принимает параметр и добавляет к нему 42.
Конструктор (->)
типа является правильным ассоциативным. Действительно, Int -> (Int -> Int)
это то же Int -> Int -> Int
самое, что и .