我知道$运算符用于避免括号。出现之后的所有内容将优先于出现的所有内容。
我试图理解在这种情况下的含义:
map ($ 3) [(+),(-),(/),(*)]
使用以下代码:
instance Show (a -> b) where
show a = function
main = putStrLn $ show $ map ($ 3) [(+),(-),(/),(*)]
输出为
["function", "function", "function", "function"]
这并不能帮助我理解此处$的含义。 如何显示更多有用的输出?
答案 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不会存储在任何地方。 (...)
因此,我们不能“看内部”函数并派生人类可读的表达式。