È possibile suddividere il codice di riferimento sul codice in due gruppi di problemi (io uso Haskell per illustrare). Sintattico, implementazione.
Sintassi Problema 1:
Currying permette una maggiore chiarezza codice in taluni casi. Cosa significa chiarezza? La lettura della funzione fornisce una chiara indicazione della sua funzionalità. ad es. La funzione mappa
map : (a -> b) -> ([a] -> [b])
Leggi in questo modo, si vede che la mappa è una funzione di ordine superiore che solleva una funzione trasformando as
-bs
a una funzione che trasforma [a]
-[b]
.
Questa intuizione è particolarmente utile quando si comprendono tali espressioni.
map (map (+1))
La mappa interna ha tipo sopra [a] -> [b]
. Per capire il tipo di mappa esterna, applichiamo ricorsivamente la nostra intuizione dall'alto. La mappa esterna solleva quindi [a] -> [b]
in [[a]] -> [[b]]
.
Questa intuizione ti porterà avanti MOLTO. Una volta generalizzato map
su fmap
, un map
su contenitori arbitrari, diventa davvero facile leggere espressioni come tali (Nota ho monomorfizzato il tipo di ogni fmap
in un tipo diverso per il gusto dell'esempio).
showInt : Int -> String
(fmap . fmap . fmap) showInt : Tree (Set [Int]) -> Tree (Set [String])
Eventualmente quanto sopra illustra che fmap
fornisce questa nozione generalizzata di sollevamento funzioni vaniglia in funzioni sopra alcuni container arbitrario.
Sintassi Problema 2:
Currying ci permette anche di esprimere le funzioni in forma libera-punto.
nthSmallest : Int -> [Int] -> Maybe Int
nthSmallest n = safeHead . drop n . sort
safeHead (x:_) = Just x
safeHead _ = Nothing
Il buon stile di cui sopra è di solito considerato come illustra pensare in termini di una pipeline di funzioni, piuttosto che la manipolazione dei dati esplicito.
Attuazione:
In Haskell, stile libero punto (attraverso accattivarsi) ci può aiutare a ottimizzare le funzioni. Scrivere una funzione in forma libera punto ci permetterà di memorizzarlo.
memoized_fib :: Int -> Integer
memoized_fib = (map fib [0 ..] !!)
where fib 0 = 0
fib 1 = 1
fib n = memoized_fib (n-2) + memoized_fib (n-1)
not_memoized_fib :: Int -> Integer
not_memoized_fib x = map fib [0 ..] !! x
where fib 0 = 0
fib 1 = 1
fib n = not_memoized_fib (n-2) + not_memoized_fib (n-1)
scrittura come una funzione curry come nella versione memoized per trattamento funzione curry come entità e quindi memoizes esso.
Cosa ti fa pensare che questi altri usi del termine siano "sbagliati"? – dfeuer