Я знаю, что используя. оператор сети функции вместе, как так:Кто может объяснить эту загадку Haskell?
isLessThanZero x
| x < 0 = True
| otherwise = False
(isLessThanZero . negate) 3 -- Produces True
Или с $:
getNegNumbers x = map (*x) [-1, -2, -3]
filter isLessThanZero $ getNegNumbers 2 -- Produces [-2, -4, -6]
Но если бы я сделать что-то вроде:
(subtract . negate) 1 2 -- 3
negate $ subtract 1 2 -- -1
Результаты здесь разные, и это не имеет смысла, поскольку две функции принимают различное количество аргументов. С .
функция negate
проверяет, является ли число отрицательным или нет, но предоставляются два аргумента. Это может означать, что выражение лево-ассоциативное.
negate (subtract 1 2) -- -1
(subtract . negate) 1 2 -- 3
Но это сбивает с толку, потому что в первом примере:
(isLessThanZero . negate) 3
выражение производит True
, что означает, что функция negate
была выполнена первая, то isLessThanZero
называется. Но в последнем примере оказалось, что сначала был вызван subtract
, а затем был вызван negate
. Поэтому я не уверен, что здесь происходит. Но это то, что еще более запутанной:
subtract 1 2 -- Produces 1!
Что означает, что все выражение:
(subtract . negate) 1 2 -- Produces 3!
является побочным эффектом использования функции цепочки.
Моя теория заключается в следующем, разлагая таким образом:
Мы знаем, что 2 - (-1) = 3. Таким образом, выражение еще правоассоциативной .. я думаю. negate
по-прежнему называется первым, как в предыдущем примере, только потому, что он влияет на первый аргумент, а не на оба аргумента, что имеет смысл, потому что negate принимает только один аргумент, и мы вообще не отображаем функцию.
Итак, когда дело доходит до цепочки функций с различным количеством аргументов, как Haskell реагирует на это?
Вы можете найти ассоциативность и приоритет любого оператора с ': i' в GHCi:': я . 'возвращает вас' [...] infixr 9 .'. –