функция, которая вводит целое число и возвращает функцию в Haskell

#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 самое, что и .