2015-04-07 31 views
2

爲什麼flip id被接受爲有效表達式? a的型號檢查是否不對b -> c`flip id`如何工作?

Prelude> :t flip 
flip :: (a -> b -> c) -> b -> a -> c 
Prelude> :t id 
id :: a -> a 
Prelude> :t flip id 
flip id :: b -> (b -> c) -> c 
+0

一旦你意識到'($)'是一樣的'id',只需用更具體的類型這將是顯而易見的。 – user102008

回答

11

的一點是,

id :: a -> a 

任何a類型,包括功能類型。也就是說,我們可以選擇a = (b -> c)並獲得

其中,因爲 ->聯繫人的權利,通常寫爲

id :: (b -> c) -> b -> c 

以上可以解釋爲函數取兩個參數

id :: (b -> c) -> (b -> c) 

:第一類型爲b -> c,第二種類型爲b。所以我們可以flip吧。

2

a S IN的id類型可以匹配任何類型,特別是(b->c)

Prelude> :t id :: (b -> c) -> (b -> c) 
id :: (b -> c) -> (b -> c) :: (b -> c) -> (b -> c) 

->是右結合的,所以我們可以刪除最右邊的一組括號

Prelude> :t id :: (b -> c) -> b -> c 
id :: (b -> c) -> b -> c :: (b -> c) -> b -> c 

製作ID變成了兩個參數的函數。