Что означает `$` при использовании в качестве аргумента функции map? - PullRequest
2 голосов
/ 08 июня 2019

Я понимаю, что оператор $ предназначен для избежания скобок. Все, что появляется после этого, будет иметь приоритет над всем, что предшествует.

Я пытаюсь понять, что это значит в этом контексте:

map ($ 3) [(+),(-),(/),(*)]

Со следующим кодом:

instance Show (a -> b) where
  show a = function

main = putStrLn $ show $ map ($ 3) [(+),(-),(/),(*)]

Выход

["function", "function", "function", "function"]

Это не поможет мне понять значение слова $ здесь. Как я могу показать более полезный вывод?

1 Ответ

4 голосов
/ 08 июня 2019

($) :: (a -> b) -> a -> b - это функция, которая принимает функцию в качестве первого параметра и значение в качестве второго и возвращает значение, примененное к этой функции.

Например:

Prelude> (1+) $ 2
3

Выражение ($ 3) является примером разбиения инфиксного оператора [Haskell-wiki] . ($ 3) это сокращение от \f -> f $ 3, или проще \f -> f 3. Таким образом, это функция, которая принимает функцию и применяет 3 к этой функции.

Для вашего выражения:

map ($ 3) [(+),(-),(/),(*)]

вывод, таким образом, эквивалентен:

[(3+), (3-), (3/), (3*)] :: Fractional a => [a -> a]

Поскольку (+), (-), (*) :: Num a => a -> a -> a работают с типами, являющимися членами класса типов Num, а (/) :: Fractional a => a -> a -> a работает с типами, являющимися членами класса типов Fractional, и все типы Fractional также являются типами num, 3 здесь относится к типу Fractional, поэтому список содержит все функции типа a -> a с a членом Fractional.

Как отобразить более полезный вывод?

Компилятор не отслеживает выражения, как указано на вики-странице Haskell в Show экземпляре для функций [Haskell-wiki] .

Компилятор Haskell не поддерживает выражения такими, какие они есть, но переводит их в машинный код или в другое низкоуровневое представление. Функция \x -> x - x + x :: Int -> Int может быть оптимизирована до \x -> x :: Int -> Int. Если он используется где-либо, он мог бы быть встроен и оптимизирован до нуля. Имя переменной x нигде не сохраняется. (...)

Таким образом, мы не можем «заглянуть внутрь» функции и получить выражение, понятное человеку.

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