Я новичок в Haskell и функциональном программировании. Я читаю через Real World Haskell, и я понял, что меня смущает несколько примеров.
В частности, это в главе 9, в разделе "Язык, специфичный для домена для предикатов", примеры, которые имеют параметры w x y z.
Я переварил это:
Почему этот код компилируется?
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, где указано это свойство (если возможно вообще).
EDIT:
Подумав об этом в течение некоторого времени, вы, кажется, подразумеваете следующее:
1) Этот синтаксис является синтаксическим сахаром, f всегда будет иметь один параметр, независимо от того, сколько параметров записано в уравнении
2) При применении функции f тело функции (всегда?) преобразуется в заглушку (фактически, возвращенную функцию), где x фиксируется с заданным параметром (4), а y является параметром.
3) Затем эта новая функция применяется к 5, которая заменяет y, а затем вычисляется функция +.
То, что меня действительно интересовало, заключалось в том, где именно он говорит что-то вроде "в уравнении функции, если вы пишете несколько параметров, это действительно синтаксический сахар, и на самом деле это происходит...", как я писал выше, Или это так очевидно для всех, кроме меня?
Изменить II:
Реальный ответ с открытием был в комментарии @luqui ниже, к сожалению, я не думаю, что могу отметить комментарий в качестве ответа.
Это тот факт, что f x y =... на самом деле является синтаксическим сахаром для: f =\x → \y → ...
И для меня все, что ниже сказано ниже, следует из этого.
Я нашел своего рода источник для этого в Gentle Introduction to Haskell, здесь: http://haskell.cs.yale.edu/tutorial/functions.html в разделе 3.1, называемом Lambda Abstractions,
Действительно, уравнения:
inc x = x + 1 добавьте x y = x + y
действительно сокращены для:
inc =\x → x + 1 add =\x y → x + y
В то время как в нем не используется фраза "синтаксический сахар", она использует более математическое ориентированное слово "стенография", но, как программист, я читаю это как "сахар": -)