Я новичок в Haskell и функциональном программировании. Я читаю через Real World Haskell, и я понял, что меня смущает несколько примеров.Условное обозначение типа-функции в 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, то он, кажется, несколько обратный к currying, как определено там - моя функция f
принимает несколько аргументов вместо одного!
Кроме того, может ли кто-либо ответить, пожалуйста, указать ссылку на какую-либо документацию Haskell, где указано это свойство (если возможно вообще).
EDIT:
Подумав об этом в течение некоторого времени, что вы два, кажется, подразумевает, что:
1) Этот синтаксис синтаксический сахар, е всегда будет иметь один параметр, независимо от того, сколько параметров записано в уравнении
2) При применении функции f тело функции (всегда?) преобразуется в заглушку (фактически, возвращенную функцию), где x фиксируется с заданным параметром (4), а y - параметр.
3) Затем эта новая функция применяется к 5, которая заменяет y, а затем вычисляется функция +.
Меня действительно интересовало, где именно он говорит что-то вроде «в функциональном уравнении, если вы пишете несколько параметров, это действительно синтаксический сахар, и на самом деле это происходит ...», как я писал выше. Или это так очевидно для всех, кроме меня?
Edit II:
Реальное разоблачение ответа был в @luqui комментария ниже, к сожалению, я не думаю, что можно пометить комментарий как ответ.
Это тот факт, что FXY = ... фактически синтаксический сахар для: е = \ х -> \ у -> ...
И для меня, все остальное все ниже сказанного следует из этого.
Я нашел своего рода источник этого в «Нежном представлении» для Haskell, здесь: http://haskell.cs.yale.edu/tutorial/functions.html в разделе 3.1, называемом абстрактами лямбда.
В самом деле, уравнения:
вкл х = х + 1 добавить ху = х + у
действительно стенография для:
вкл = \ х -> х + 1 добавить = \ х -> х + у
Хотя он не использует фразу «синтаксический сахар», она использует более, эм, mathemati но в качестве программиста я прочитал это как «сахар» :-)
Разумеется, это не очевидно, но это то, что нам нужно было привыкнуть довольно быстро, чтобы вытащить Haskell. Возможно, именно поэтому авторы забывают упомянуть об этом явно. Довольно уверен, что вы знаете, что Хаскелл описывает это. – luqui
Ваша точка № 2 немного не работает. После определения вашей функции он принимает аргументы, которые он принимает. Когда вы называете это 'f 4 5', это анализирует как' (f 4) 5', и поэтому 'f' вызывается с' 4' в качестве аргумента и эффективно возвращает функцию '\ y -> 4 + y'. Тогда у вас есть '(\ y -> 4 + y) 5', который становится' 4 + 5', а затем '9'. Хитрость заключается в том, что тип функции и определение функции являются право-ассоциативными, а функциональное приложение остается ассоциативным, так что они хорошо выстраиваются. –
@Antal s-z Спасибо, что исправил меня и указал на симметрию между типом функции и функцией. Вы могли бы сказать, что «ваша функция фактически не принимает никаких аргументов, это все лямбда, которые затем налиты». –