2012-01-24 107 views

回答

12

curry在這裏使用是錯誤的;它將一個在元組上運行的函數轉換成一個curried函數。你想反其道而行之,這是uncurry

uncurry :: (a -> b -> c) -> (a, b) -> c 

在這種情況下,它的uncurry (<)

(用於在元組編寫函數有用的組合子的另一個有用來源是Control.Arrow;因爲(->)Arrow一個實例,你可以閱讀a b cb -> c

1

在類型看是在Haskell的最佳途徑拿到第一個想法,任何的功能是什麼:

curry :: ((a, b) -> c) -> a -> b -> c 
uncurry :: (a -> b -> c) -> (a, b) -> c 

curry:對→咖喱功能的功能(它curries函數)。

uncurry:咖喱函數→函數對。

Haskell Wiki page on currying有小練習在頁面的末尾:

  • 簡化curry id
  • 簡化uncurry const
  • 快遞snd使用curryuncurry等基本前奏功能和不lambda表達式
  • 在沒有lambda和wi的情況下編寫函數\(x,y) -> (y,x)只有前奏功能

試着立即解決這些練習,他們會給你一個大量的Haskell類型系統和函數應用的見解。

還有的uncurry幾個有趣的應用程序,嘗試不同的參數傳遞給下面的功能,看看他們做了什麼:

uncurry (.) :: (b -> c, a -> b) -> a -> c 
uncurry (flip .) :: (b -> a -> b1 -> c, b) -> b1 -> a -> c 
uncurry (flip (.)) :: (a -> b, b -> c) -> a -> c 
uncurry ($) :: (b -> c, b) -> c 
uncurry (flip ($)) :: (a, a -> c) -> c 

-- uncurry (,) is an identity function for pairs 
uncurry (,) :: (a, b) -> (a, b) 
uncurry (,) (1,2) -- returns (1,2) 
uncurry uncurry :: (a -> b -> c, (a, b)) -> c 
uncurry uncurry ((+), (2, 3)) -- returns 5 

-- curry . uncurry and uncurry . curry are identity functions 
curry . uncurry :: (a -> b -> c) -> (a -> b -> c) 
(curry . uncurry) (+) 2 3 -- returns 5 
uncurry . curry :: ((a, b) -> c) -> ((a, b) -> c) 
(uncurry . curry) fst (2,3) -- returns 2 

-- pair -> triple 
uncurry (,,) :: (a, b) -> c -> (a, b, c) 
uncurry (,,) (1,2) 3 -- returns (1,2,3)