2009-11-11 43 views
10

的類型Prelude功能flip的是:是否可以在`flip`中使用一元函數而不是二進制?

flip :: (a -> b -> c) -> b -> a -> c 

即,它需要一個二進制函數並兩個參數。

的類型Prelude功能id的是:

id :: a -> a 

flip id類型是:

flip id :: a -> (a -> b) -> b 

怎麼可能適用flipidid是一元函數flip需要第一個arg的二元函數嗎?

btw。 flip id類似於\ x f -> f x

回答

15

Haskell使得id通過設置a = b -> c來適合flip的第一個參數的類型。所以:

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

其中id被取爲類型

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

這相當於

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

id一個特例,只有適用於一元函數的。

編輯:我想我可能會改寫我的第一行:
哈斯克爾推斷id符合第一個參數的類型flip如果a = b -> c
萬一有什麼更清楚的。

+0

我忘了,一般類型標識符'了'可以是功能太多了,謝謝。 – 2009-11-11 14:46:01

4

Nefrubyr解釋得很好。
(有希望)使這個更直觀一點的另一種方法是想想功能應用程序運算符($)

($)id一種特殊形式:

($) :: (a -> b) -> (a -> b) 
($) = id 

我見過的定義(#) = flip ($),這樣你可以在函數之前它適用於書寫的說法:obj # show

很明顯,因爲($)id只是一種特殊形式,你也可以這樣寫:(#) = flip id

相關問題