C'è un modo migliore per esprimere (\(a, b) -> a < b)
con la composizione funzione? Mi sento come se mi mancasse qualcosa e sperimentare con curry
mi ha solo confuso di più.tuple e la funzione di composizione
risposta
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
.)
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
utilizzandocurry
ouncurry
e altre funzioni di base Prelude e senza lambda- Scrivi la funzione
\(x,y) -> (y,x)
senza lambda e wi solo funzioni PreludioProvate 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)