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
爲什麼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
的一點是,
id :: a -> a
爲任何a
類型,包括功能類型。也就是說,我們可以選擇a = (b -> c)
並獲得
->
聯繫人的權利,通常寫爲
id :: (b -> c) -> b -> c
以上可以解釋爲函數取兩個參數
id :: (b -> c) -> (b -> c)
:第一類型爲b -> c
,第二種類型爲b
。所以我們可以flip
吧。
的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變成了兩個參數的函數。
一旦你意識到'($)'是一樣的'id',只需用更具體的類型這將是顯而易見的。 – user102008