Haskell domanda tipo di firma
-
28-09-2019 - |
Domanda
Qualcuno mi può spiegare, perché fare queste funzioni avere diverso numero di argomenti e comportamenti , ma stesso tipo di firma , eppure entrambi sono corrette?
comp1 :: (a -> b) -> (b -> c) -> a -> c
comp1 f g = g.f
comp2 :: (a -> b) -> (b -> c) -> a -> c
comp2 f g x = g (f x)
Inoltre, perché fa comp2 ha
comp2 :: (a -> b) -> (b -> c) -> a -> c
invece di qualcosa come
comp2 :: a -> (a -> b) -> (b -> c) -> a -> c
Grazie.
Soluzione
comp2 f g x = g (f x)
è zucchero sintattico per
comp2 = \f -> \g -> \x -> g (f x)
Allo stesso modo
comp1 f g = g.f
è lo zucchero per
comp1 = \f -> \g -> g.f
La definizione di .
è:
f1 . f2 = \x -> f1 (f2 x) -- Names of arguments have been changed to avoid confusion
Quindi, se inseriamo la definizione nella forma Dezuccherato di comp1
, otteniamo:
comp1 = \f -> \g -> \x -> g (f x)
Questa è esattamente la stessa della forma di Dezuccherato comp2
, così chiaramente le definizioni sono equivalenti.
Altri suggerimenti
comp1 f g = g.f
è scritto in libero-point stile (non riferendosi a punti, ma a valori ). Quando si chiama comp1
, v'è implicitamente un terzo parametro di essere passato a g.f
, che è la composizione delle due funzioni g
e f
: (g.f) x
uguale g (f x)
, vale a dire g
viene passato il risultato di f x
. Nessun parametro x
esiste in comp1
perché è implicitamente passato alla funzione. (Si potrebbe pensare comp1
come parzialmente applicato o al curry funzione se ti fa sentire meglio.)
tipo di comp2
richiede due funzioni, uno da (a->b)
e un'altra (b->c)
, così come un parametro di tipo a
. Non v'è alcuna necessità di porre a ->
nella sua firma.
Le due funzioni sono davvero equivalenti; si usa semplicemente alcuni trucchi Haskell ad essere più conciso.
Currying . Una funzione multi-argomento a ML e Haskell, è lo zucchero sintattico per una funzione one-argomento che restituisce una funzione; la funzione che restituisce prende le restanti argomenti.