curry f a b = f(a,b)
心想: 咖喱函數取功能晶圓廠,並返回F(A,B),所以我想類型是:瞭解各類需要幫助的(基於咖喱)
(a -> b -> c) -> (a, b) -> c
所以爲什麼類型被顛倒?:
((a, b) -> c) -> (a -> b -> c)
curry f a b = f(a,b)
心想: 咖喱函數取功能晶圓廠,並返回F(A,B),所以我想類型是:瞭解各類需要幫助的(基於咖喱)
(a -> b -> c) -> (a, b) -> c
所以爲什麼類型被顛倒?:
((a, b) -> c) -> (a -> b -> c)
我相信你的困惑的來源是這樣一段話:
咖喱函數取函數f A B
不是真的:curry
需要一個功能,這功能是f
。至於a
和b
,它們是傳遞給curried函數的參數。這是比較容易地看到,通過添加一對多餘的括號,以使局部應用更明顯...
(curry f) a b = f (a,b)
...或通過用一個lambda移位a
和b
到右手側:
curry f = \a b -> f (a,b)
f
是一個函數,一對 - 注意,我們給它一對,(a,b)
。另一方面,curry f
分別採用兩個參數。如此,curry
的類型確實是:
curry :: ((a, b) -> c) -> (a -> b -> c)
咖喱只接受一個參數,它是一個函數並返回一個函數。這樣的說法是與簽名
((a, b) -> c)
即一個函數,它有一個參數的函數:一對事物a和b,並返回另一件事℃。庫裏確實有些不可思議該功能,並把它變成一個新的功能:
(a -> b -> c)
即有兩個參數的函數:一件事和一件事b,並返回一個東西℃。
因此,代碼:
curry f a b
是這樣的:
let newFunction = curry(f)
newFunction a b
基本上咖喱變換一個函數,它的一對成需要的是一對兩個參數,而不是一個函數。