2015-03-03 106 views
1

約從http://www.seas.upenn.edu/~cis194/lectures/02-lists.html咖喱/ uncurry(schönfinkel/unschönfinkel)的定義,如何理解咖喱的函數定義/ uncurry

schönfinkel :: ((a,b) -> c) -> a -> b -> c 
schönfinkel f x y = f (x,y) 

unschönfinkel :: (a -> b -> c) -> (a,b) -> c 
unschönfinkel f (x,y) = f x y 

但我覺得上面這些函數的定義應該是:

schönfinkel :: ((a,b) -> c) -> a -> b -> c 
schönfinkel f (x,y) = f x y 
-- schönfinkel(curry) converts an uncurried function 
-- (f (x,y), its type signature is (a,b) -> c) 
-- to a curried function 
-- (f x y, its type signature is a -> b -> c) 

unschönfinkel :: (a -> b -> c) -> (a,b) -> c 
unschönfinkel f x y = f (x,y) 
-- unschönfinkel(uncurry) converts a curried function 
-- (f x y , its type signature is a -> b -> c) 
-- to an uncurried function 
-- (f (x,y), its type signature is (a,b) -> c) 

請有人給我一個簡單的解釋?

+0

在'schönfinkel'中,如果'f'具有類型'(a,b) - > c'then然後你不能像你所做的那樣將它應用於2個參數。你在一個元組上匹配模式,但是類型表示還有兩個參數,它們都不是元組。 – user2407038 2015-03-03 05:40:56

回答

4

你可能誤解/誤解的初始代碼,一個適當的縮進大概是足以得到它的權利:

schönfinkel :: ((a,b) -> c) -> a -> b -> c 
schönfinkel f    x y = f (x,y) 

unschönfinkel :: (a -> b -> c) -> (a,b) -> c 
unschönfinkel f    (x,y) = f x y 

現在,讓我們打開ghci中和嘗試了幾件事:

>>> let schönfinkel f x y = f (x,y) 

>>> let toBeCurried (x,y) = x ++ y 
>>> :t toBeCurried 
toBeCurried :: ([a], [a]) -> [a] 

>>> :t schönfinkel toBeCurried 
schönfinkel toBeCurried :: [a] -> [a] -> [a] 

看看你給的非正式定義,你會看到它匹配e行爲schönfinkel

+0

請確認我的理解是否正確: f(x,y)(schönfinkel的函數體)並不意味着它是一個函數,它只是元組(x,y)中f的一個VAULE。我對嗎? – 2015-03-03 11:03:25

+0

在右邊的部分,'f(x,y)'是參數中給出的函數'f'的應用,由'schöfinkel'的最後兩個參數構成的元組''(x,y)''。根據'f'的簽名,'f(x,y)'被解釋爲類型'c'的「值」。 – Nicolas 2015-03-03 11:15:59

-5

這裏是由Dierk &鈷

的基本思想是利用一個函數具有多個參數 和通過固定它的一些轉換成具有較少參數的函數的一小塊的約在Groovy在行動咖喱解釋價值。一個典型的例子是選擇一些任意值n並將一個將兩個參數相加的函數轉換爲一個函數,該函數只接受一個參數並將n加入到函數中。

Groovy中有一個內置的閉合的方法稱爲咖喱這需要任意值綁定到閉包的參數和約束值的各個參數後返回封閉的克隆。請參考下面的鏈接,詳細瞭解

Groovy functional programming