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

net*_*tik 1 haskell

我正在通过第一本haskell书并与$运营商斗争:

以下行有效:

map (>= 16) . take 5 $ iterate  (\x -> x^2) 2
Run Code Online (Sandbox Code Playgroud)

但是,以下内容不是:

map (>= 16) . take 5 (iterate  (\x -> x^2) 2)
Run Code Online (Sandbox Code Playgroud)

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

我没有在这里看到问题.take采用int和列表.据我所知,我提供了两个论点.

如果我想避开$操作员,我该怎么办?

Wil*_*sem 7

($) :: (a -> b) -> a -> b操作是,只是有一个功能的优先级最低(infixr 0($!)seq具有相同的优先级).结果是:

map (>= 16) . take 5 $ iterate  (\x -> x^2) 2
Run Code Online (Sandbox Code Playgroud)

相当于:

(map (>= 16) . take 5) (iterate  (\x -> x^2) 2)
Run Code Online (Sandbox Code Playgroud)

左手操作数的括号也是如此.

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