Haskell: понимание оператора приложения функции при использовании с функцией карты - PullRequest
1 голос
/ 14 июня 2019

У меня есть следующее выражение Haskell:

map ($ 5) [(-),(+),(*)]

Я знаю, что оператор приложения функции ($) применяет функцию к данному параметру. Однако, поскольку функции (-), (+) и (*) принимают два параметра, применяя эти функции к 5 через map, функции применяются частично.

Результирующий список будет содержать три функции, которые принимают другой параметр и:

(1) Вычитает параметр из 5

(2) Добавляет параметр к 5

(3) Умножает параметр на 5

Однако можно ли сказать, что приведенное выше выражение эквивалентно следующему?

[(5 -),(5 +),(5 *)]

Я думаю, что это правильно, так как я проверил типы (5 -), (5 +) и (5 *) в GHCI, и все они являются функциями, которые принимают число и возвращают число:

(5 -) :: Num a => a -> a
(5 +) :: Num a => a -> a
(5 *) :: Num a => a -> a

Любые идеи приветствуются.

1 Ответ

3 голосов
/ 14 июня 2019

Корректное; Вы также можете обратиться к операторам во второй раз через:

map ($4) $ map ($ 5) [(-),(+),(*)]

производство [5-4, 5 + 4, 5 * 4]

Также вы можете указывать аргументы справа от оператора, давая тот же результат:

[((-) 5),(+ 5),(* 5)]

(Причина, по которой (-) 5 заключена в скобки "-", заключается в том, что компилятор не думает, что вы имеете в виду "минус пять", отрицательное число, обычная интерпретация (- 5)).

...