当用作地图函数的参数时,`$`是什么意思?

时间:2019-06-08 12:33:07

标签: haskell functional-programming

我知道$运算符用于避免括号。出现之后的所有内容将优先于出现的所有内容。

我试图理解在这种情况下的含义:

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

使用以下代码:

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

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

输出为

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

这并不能帮助我理解此处$的含义。 如何显示更多有用的输出?

1 个答案:

答案 0 :(得分:4)

($) :: (a -> b) -> a -> b是一个将函数作为第一个参数,将值作为第二个参数并返回应用于该函数的值的函数。

例如:

Prelude> (1+) $ 2
3

表达式($ 3)infix operator sectioning [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类型类的成员的类型,并且所有{{ 1}}类型也是num类型,Fractional在这里也是3类型,因此列表包含所有类型为Fractional且其中a -> a是成员的函数的a

  

如何显示更多有用的输出?

编译器无法跟踪Show instance for functions [Haskell-wiki]上Haskell Wiki页面中指定的表达式。

  

Haskell编译器不会按原样维护表达式,而是将它们转换为机器代码或其他一些低级表示形式。函数Fractional可能已优化为\x -> x - x + x :: Int -> Int。如果在任何地方使用它,它可能已经被内联并且没有任何优化。变量名称x不会存储在任何地方。 (...)

因此,我们不能“看内部”函数并派生人类可读的表达式。