关于$运算符和括号的混淆

时间:2017-03-03 18:54:15

标签: haskell

我正在努力完成第一本哈斯克书并与$运算符斗争:

以下行有效:

map (>= 16) . take 5 $ iterate  (\x -> x^2) 2

但是,以下情况并非如此:

map (>= 16) . take 5 (iterate  (\x -> x^2) 2)
  

可能的原因:`take'应用于太多参数

我没有在这里看到问题。 take采用int和list。据我了解,我提供了两个论点。

如果我想避开$运算符,我该怎么办?

1 个答案:

答案 0 :(得分:7)

($) :: (a -> b) -> a -> b运算符只是最低优先级infixr 0,只有($!) and seq have the same priority)的函数。结果:

map (>= 16) . take 5 $ iterate  (\x -> x^2) 2

相当于:

(map (>= 16) . take 5) (iterate  (\x -> x^2) 2)

左侧操作数的括号也是如此。

Haskell实际上是一件好事,你可以使用运算符作为分组机制:($)简单地定义为($) f x = f x,但由于它是一个运算符,它可以是用作避免括号的方法。