2017-03-03 93 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,但由於它是一個運算符,因此可以用作避免括號的方式。