Как здесь работает частичное приложение? - PullRequest
2 голосов
/ 04 ноября 2010
> map (++ "!") ["a", "b", "c"]
["a!","b!","c!"]
> (++) "!" "a"
"!a"

Эти две строки не имеют смысла для меня. При использовании ++ в map кажется, что первый параметр добавляется ко второму, но во втором списке все наоборот. Как Хаскелл рассуждает о поведении в функции map?

Ответы [ 3 ]

9 голосов
/ 04 ноября 2010

(++ "!") - это специальный синтаксис, называемый операторной секцией .Он частично применяет второй параметр инфиксного оператора, тогда как (++) "!" работает как обычное частичное применение и применяет первый параметр.

Вы также можете сделать то же самое с обычными функциямиИспользуемый инфиксный стиль с обратными чертами: (`map` [1..3]) эквивалентен (\f -> map f [1..3]).

Это кажется странным, потому что это особая особенность, которая присутствует там только потому, что она чертовски полезна.

2 голосов
/ 04 ноября 2010
map (++ "!) ["a", "b", "c"]

эквивалентно

["a" ++ "!", "b" ++ "!", "c" ++ "!"]

И

(++) "!" "a"

эквивалентно

"!" ++ "a"

Надеюсь, это поможет.

2 голосов
/ 04 ноября 2010

Частичное применение (++ "!") идентично (\x -> x ++ "!"). Другими словами, выражение (++ "!") достаточно умен, чтобы знать, что "!" является вторым аргументом (++). Он знает это, потому что знает, что ++ является инфиксным оператором. Во втором выражении (++) "!" "a" идентичен "!" ++ "a" и выполняет то, что вы ожидаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...