2015-07-08 4 views
2

У меня есть следующие анонимные функции:Haskell: анонимная функция с двумя аргументами

(\x y -> y+y) (5*(7+20)) 

Насколько я понимаю, анонимные функции, х должно быть (5 * (7 + 20)) и у не дано (где он становится рыбным). Когда я пытаюсь выполнить эту функцию, GHCI говорит мне возвращаемое значение

Integer -> Integer 

Так, очевидно, моя интерпретация здесь не так, и я просто не могу понять, почему. Может ли кто-нибудь объяснить мне, что здесь происходит?

ответ

10

Посмотрите на это так: если бы вы предоставили значение y, вы получили бы целое число. Если вы не предоставите значения, вы получите выражение, которое принимает целое число (которое вы вызываете у) и возвращает целое число, то есть функцию

Integer -> Integer 

Это работает для названных функций тоже. Например.

plus :: Int -> Int -> Int 
plus x y = x + y 

Вы можете проверить в GHCI, что тип plus 1 является Int -> Int. Фактически, этот процесс работает для любой функции в Haskell. Вы читаете больше на HaskellWiki.

6

Предоставляя функцию из двух аргументов только одна, получается partial application этой функции, результат которой является функцией одного (оставшегося) аргумента. Хотя в вашем случае подпись возвращаемой функции равна Integer -> Integer.

5

Обратите внимание, что

\x y -> y+y 

является синтаксически

\x -> (\y -> y+y) 

т.е. вместо того, чтобы говорить “ лямбда функции двух аргументов ” вы могли бы сказать, что это функция только один аргумент. Возвращаемый тип просто снова является функцией.

Эта техника currying действительно важна для хорошего кода Haskell; частичное приложение делает многие вещи очень краткими, не жертвуя удобочитаемостью. Например,

GHCi> map (logBase 2) [1,2,4,8,16] 
[0.0, 1.0, 2.0, 3.0, 4.0] 

Здесь я использовал logBase как функция одного аргумента (2), что дает мне простой номер → номер функции, который может быть отображен над списком. Без currying мне понадобилось бы написать map (\x -> logBase(2,x)) [1,2,4,8,16].

Смежные вопросы