Типовая подпись vs. функциональное уравнение в Haskell

Я новичок в Haskell и функциональном программировании. Я читал Real World Haskell и понял, что меня смущают некоторые examples.

В частности, это в главе 9, в разделе «Доменно-специфический язык для предикатов», примеры, которые имеют параметры wxyz.

Я свел это к следующему:

Почему это компиляция кода?

f :: Int -> (Int -> Int)
f x y = x+y

main = do
  let q = f 4 5
  putStr  (show (q))

Согласно сигнатуре типа, f явно принимает 1 параметр и возвращает функцию. Я читал Real World Haskell и понял, что несколько примеров сбивают меня с толку. В частности, это в главе 9, в разделе «A ...

Я новичок в Haskell и функциональном программировании. Я читал Real World Haskell и понял, что меня смущают некоторые examples.

В частности, это в главе 9, в разделе «Доменно-специфический язык для предикатов», примеры, которые имеют параметры wxyz.

Я свел это к следующему:

Почему это компиляция кода?

f :: Int -> (Int -> Int)
f x y = x+y

main = do
  let q = f 4 5
  putStr  (show (q))

Согласно сигнатуре типа, f явно принимает 1 параметр и возвращает функцию. Я читал Real World Haskell и понял, что несколько примеров сбивают меня с толку. В частности, это в главе 9, в разделе «A ...

Я новичок в Haskell и функциональном программировании. Я читал Real World Haskell и понял, что меня смущают некоторые examples.

В частности, это в главе 9, в разделе «Доменно-специфический язык для предикатов», примеры, которые имеют параметры wxyz.

Я свел это к следующему:

Почему это компиляция кода?

f :: Int -> (Int -> Int)
f x y = x+y

main = do
  let q = f 4 5
  putStr  (show (q))

Согласно сигнатуре типа, f явно принимает 1 параметр и возвращает функцию. m новичок в Haskell и функциональном программировании. Я читаю Real World Haskell и понял, что меня сбивают с толку несколько примеров.

В частности, это в главе 9, в разделе «Доменно-специфический язык для предикатов», примеры, которые имеют Параметры wxyz.

Я свел это к следующему:

Почему этот код компилируется?

f :: Int -> (Int -> Int)
f x y = x+y

main = do
  let q = f 4 5
  putStr  (show (q))

Согласно сигнатуре типа, f явно принимает 1 параметр и возвращает функцию. m новичок в Haskell и функциональном программировании. Я читаю Real World Haskell и понял, что меня сбивают с толку несколько примеров.

В частности, это в главе 9, в разделе «Доменно-специфический язык для предикатов», примеры, которые имеют Параметры wxyz.

Я свел это к следующему:

Почему этот код компилируется?

f :: Int -> (Int -> Int)
f x y = x+y

main = do
  let q = f 4 5
  putStr  (show (q))

Согласно сигнатуре типа, f явно принимает 1 параметр и возвращает функцию. Однако, похоже, я могу написать уравнение функции, чтобы оно принимало два параметра и возвращало int. Почему это возможно? Означает ли это, что сигнатура типа игнорируется?

Это каррирование? Это какое-то закрытие? Если я правильно понимаю эту http://www.haskell.org/haskellwiki/Currying , то она кажется несколько противоположной каррированию, как определено там - моя функция f принимает несколько аргументов вместо одного!

Кроме того, может ли кто-нибудь ответить, пожалуйста, предоставьте ссылку на какую-нибудь документацию Haskell, где указана эта возможность (если это вообще возможно).

РЕДАКТИРОВАТЬ:

Поразмыслив над этим некоторое время, вы двое, кажется, имеете в виду следующее:

1) Этот синтаксис является синтаксическим сахаром, f всегда будет иметь один параметр, независимо от того, сколько параметров записаны в уравнении

2) После применения f тело функции будет (всегда?) преобразовано в заглушку (фактически, возвращенную функцию), где x фиксируется на заданном параметре (4), и y - параметр. Или это так очевидно для всех, кроме меня?

Edit II:

Настоящий откровенный ответ был в комментарии @luqui ниже, к сожалению, я не думаю, что могу отметить комментарий как ответ.

Это факт, что fxy = ... на самом деле является синтаксическим сахаром для: f = \ x -> \ y -> ...

И для меня все остальное, что сказано ниже, следует из этого.

Я нашел своего рода источник для этого в Мягком введении в Haskell, здесь: http://haskell.cs.yale.edu/tutorial/functions.html в разделе 3.1, который называется «Лямбда-абстракции».

Фактически, уравнения:

inc x = x + 1 add xy = x + y

на самом деле является сокращением для:

inc = \ x -> x + 1 add = \ xy -> x + y

Хотя в нем не используется фраза «синтаксический сахар», но используется более, ммм, математически ориентированное слово «стенография», но как программист я прочитал это как «сахар» : -)

12
задан Guy Coder 15 December 2013 в 14:51
поделиться