也許是做的最好的事情就是想約兩簡單的功能:
f :: a -> (b -> c)
g :: (a -> b) -> c
讓我們來看看這些功能反過來。
第一個函數f
採用類型爲a
的單個參數,並返回類型爲b -> c
的函數。換句話說,你可以寫類似於以下,假設x :: a
,y :: b
,並z :: c
:
f :: a -> (b -> c)
f x = f'
where f' :: b -> C
f' y = z
另一種方式來寫的f
簽名是:
f :: a -> b -> c
這在默認情況下工作,因爲我們將->
綁定到右側。它也給了我們另一種理解f
的等效方式:它可以被認爲是一個函數,它帶有兩個參數,類型爲a
和b
,併產生c
類型的結果。
第二個函數g
帶有一個參數,它是類型爲a -> b
的函數。
g :: (a -> b) -> c
g h = z
where h :: a -> b
因此這兩者是非常不同的。
將此應用於您的函數,第一個函數需要4個值類型爲Int
並返回Int
。第二個函數採用類型爲((Int -> Int) -> Int) -> Int
的單個函數,並且這是一個函數,其採用類型爲(Int -> Int)
的第三個函數,並生成Int
,依此類推。