2016-08-11 53 views
8

比方說,我想編寫Text.packText.strip爲什麼函數組合需要括號?

:t (.)生產:(b -> c) -> (a -> b) -> a -> c

:t (Text.pack)生產:String -> Text

:t (Text.strip)生產:Text -> Text

所以對於(b -> c)strip給出: b = Text c = Text

pack(a -> b)給出: a = String b = Text

讓我們驗證::t strip . pack生產: strip . pack :: String -> Text

OK,讓偉大的嘗試:

strip.pack " example "

產地:

Couldn't match expected type ‘a -> Text’ with actual type ‘Text’ 
Relevant bindings include 
    it :: a -> Text (bound at <interactive>:31:1) 
Possible cause: ‘pack’ is applied to too many arguments 
In the second argument of ‘(.)’, namely ‘pack " example  "’ 
In the expression: strip . pack " example  " 

(strip . pack) " example "按預期工作....爲什麼?

回答

11

功能應用程序的優先級高於組合。

strip.pack " example "相當於strip.(pack " example ")。這就是爲什麼人們使用$「壓低」應用程序,直到之後的所有功能已經組成:

strip . pack $ " example  " 
+8

更強大的功能應用比*其他任何*都具有更高的優先級。 – amalloy

+9

@amalloy ...除了記錄更新。 = P –

+0

該優先權允許例如'甚至過濾。地圖(+5)'。組成部分應用的功能是相當習慣的。還要注意,爲了方便起見,選擇了「map,filter,...」參數的順序。 – chi

1

功能的應用程序擁有的功能複合算一個更高的優先級。

相關問題