($) :: (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 нигде не сохраняется. (...)
Таким образом, мы не можем «заглянуть внутрь» функции и получить выражение, понятное человеку.