簡體   English   中英

如何理解咖喱/無咖喱的功能定義

[英]How to understand the function definitions of curry/uncurry

來自http://www.seas.upenn.edu/~cis194/lectures/02-lists.html的關於curry / uncurry(schönfinkel/unschönfinkel)的定義,

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)

有人可以給我一個簡單的解釋嗎?

您可能會誤讀/誤解了初始代碼,適當的縮進可能足以使它正確:

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]

查看您給出的非正規定義,您會發現它與schönfinkel的行為匹配。

這是Dierk&Co的Groovy In Action中關於咖喱的一小部分解釋

基本思想是采用具有多個參數的函數,並通過固定某些值將其轉換為具有較少參數的函數。 一個經典的示例是選擇一些任意值n並將一個將兩個參數求和的函數轉換為一個函數,該函數采用一個參數並將其加n。

Groovy有一個內置的Closure方法,稱為curry ,該方法接受任意值以綁定到Closures參數,並在將值綁定到各個自變量后返回Closure的克隆。 請參考以下鏈接以了解詳細信息

Groovy函數式編程

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM