2012-01-24 3 views

risposta

12

curry è la cosa sbagliata da usare qui; trasforma una funzione che opera su tuple in una funzione al curry. Si desidera il contrario, che è uncurry:

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

In questo caso, si tratta di uncurry (<).

(Un'altra fonte utile per combinatori utili nelle funzioni di scrittura su tuple è Control.Arrow; poiché (->) è un'istanza di Arrow, è possibile leggere a b c come b -> c.)

1

Guardando i tipi è il modo migliore in Haskell per ottenere la prima idea, quello che ogni funzione fa:

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

curry: funzione della coppia → funzione di curry (che curries una funzione).

uncurry: curry funzione → funzione della coppia.

Haskell Wiki page on currying ha piccoli esercizi alla fine della pagina:

  • Semplificare curry id
  • Semplificare uncurry const
  • espresso snd utilizzando curry o uncurry e altre funzioni di base Prelude e senza lambda
  • Scrivi la funzione \(x,y) -> (y,x) senza lambda e wi solo funzioni Preludio

Provate a risolvere questi esercizi in questo momento, vi daranno una visione completa del sistema di tipo Haskell e dell'applicazione della funzione.

Ci sono diverse applicazioni interessanti uncurry, cercare di passare diversi argomenti per le funzioni qui sotto e vedere cosa fanno:

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)