Я новичок в 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
Хотя в нем не используется фраза «синтаксический сахар», но используется более, ммм, математически ориентированное слово «стенография», но как программист я прочитал это как «сахар» : -)