Примеры plus
и plus'
поучительны.Вы видите, что последний, похоже, не имеет аргументов, по крайней мере, слева от знака равенства:
plus' :: Int -> Int -> Int
plus' = \x -> \y -> x + y
Давайте создадим еще одну пару версий приращения (я назову их после того, как "удар")- 1) на полпути к окончательным версиям, которые вы дали:
bump :: Int -> Int
bump y = 1 + y
bump' :: Int -> Int
bump' = \y -> 1 + y
Аналогия между этими двумя определениями аналогична описанной между plus
и plus'
, поэтому они должны иметь смысл, включаяпоследний, даже если у него нет формальных аргументов в левой части знака равенства.
Теперь, ваше понимание bump'
, точно такое же понимание, которое вам нужно понять increment'
, как вы далиэто по твоему вопросу!Фактически, мы определяем bump'
как равное чему-то, что точно равно increment'
.
То есть (как мы вскоре увидим), правая часть *Определение 1019 *,
\y -> 1 + y
- это то, что равно
plus 1
Две нотации или выражения являются двумя синтаксическими способами определения "функции, которая принимает числои возвращает на единицу больше, чем оно. "
Но что делает их равными?! Ну, (как объяснили другие авторы) выражение plus 1
является частично примененным ,Компилятор, в некотором роде, знает, что plus
требует два аргумента (он был объявлен таким образом в конце концов), и поэтому, когда он появляется здесь применительно только к одному аргументу, компилятор знает, что он все еще ожидает еще один.Он представляет это «ожидание», предоставляя вам функцию, говоря, что, если вы дадите еще один аргумент, будь то сейчас или позже, это сделает эту вещь полностью примененной, и программа фактически перейдет к телу функции plus
(таким образом,вычисление x + y
для двух приведенных аргументов: литерала 1
из выражения plus 1
и приведенного позже «еще одного» аргумента)
Ключевая часть радости и ценности Haskellдумает о функциях как о вещах самих по себе, которые можно передавать и очень гибко преобразовывать из одного в другое.Частичное применение - это просто способ преобразования одной вещи (функция с «слишком большим количеством аргументов», когда вы хотите зафиксировать значение дополнительных функций) в функцию «просто правильных многих».Вы можете передать частично примененную функцию интерфейсу, который ожидает определенное количество аргументов.Или вы можете просто захотеть определить несколько специализированных функций на основе одного общего определения (как мы можем определить общие plus
и более конкретные функции, такие как plus 1
и plus 7
).