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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top