Почему и карта (^ 2) xs, и карта (2 ^) xs работают так, как ожидается в Haskell? - PullRequest
5 голосов
/ 16 января 2011

Почему

map (^2) [1..10]

работает, а также

map (2^) [1..10]

работает?

Я бы ожидал, что он будет работать только с одним из них, а не с обоими.

Я думал, что map будет перебирать все элементы [1..10], а затем делать

[1^2, 2^2, 3^2, ...]

для map (^2) [1..10].Тогда я ожидал бы, что когда ему дано map (2^) [1..10], это приведет к синтаксической ошибке или чему-то еще, потому что ему нужно, чтобы числа были после ^, а не до.

Ответы [ 3 ]

16 голосов
/ 16 января 2011

Грамматика Haskell имеет специальную поддержку для такой конструкции, называемой «операторными секциями». Если у вас есть какой-нибудь инфиксный оператор, например, скажем #$%, то поддерживаются следующие обозначения:

(#$%)   = \x y -> x #$% y
(#$% y) = \x   -> x #$% y
(x #$%) = \y   -> x #$% y

Так что вы ожидаете, что некоторая математическая последовательность нарушит это, и если бы Haskell был крошечным языком, таким как Forth, я был бы склонен согласиться с вашей интуицией. Причина, по которой это работает, в основном «потому что они написали так, чтобы работать так».

(Он был добавлен также для уменьшения неоднозначности - означает f + x означает f применяется к двум аргументам или означает + применяется к двум аргументам? Поскольку на самом деле это означает последний, как мы можем представлять первое? Ответ: используя (), чтобы ввести раздел оператора.)

3 голосов
/ 16 января 2011

Haskell знает, что ^ является инфиксным оператором, поэтому он интерпретирует (в математической записи) (2^) как f(x) = 2^x и (^2) как f(x) = x^2.

0 голосов
/ 16 января 2011

(2 ^) создает новую функцию, которая принимает параметр и вызывает (2 ^ параметр).Это способ определения.

Вот ссылка на эту теорию: Частичное применение (Haskell.org)

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