2017-03-03 62 views
1

我通过第一个Haskell书工作我的方式,并与运营商$奋斗:

下面这行工作:

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

但是,下面没有按” T:

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

可能的原因:'拿”被应用到的参数太多

我在这里没有看到问题。 take接受一个int和一个列表。就我的理解,我提供了两个论点。

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

+2

原始相当于'(map(> = 16)。take 5)(iterate(\ x - > x^2)2)'。 '''期望它的操作数是函数。你也可以写'map(> = 16)$ take 5(iterate(\ x - > x^2)2)'。 – Ryan

+1

'地图(> = 16)。取5(iterate(\ x - > x^2)2)'实际上是指'(map(> = 16))。 (取5(iterate(\ x - > x^2)2))''so'(。)'传递函数和列表而不是两个函数。请记住,应用程序'f x y z'比'+'或'''具有更高的优先级。 – chi

+1

我经常遵循这个规则:'''单独的函数和$''的参数这将给出'map(> = 16)。拿5。迭代(^ 2)$ 2' – Ingo

回答

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,但由于它是一个运算符,因此可以用作避免括号的方式。