Altri hanno affrontato molti aspetti di questa domanda abbastanza bene. Vorrei dire una parola sulla logica alla base del motivo per cui +
ha la firma del tipo Num a => a -> a -> a
.
In primo luogo, la classe di caratteri Num
non ha modo di convertire un'istanza artbitrary di Num
in un'altra. Supponiamo che abbia un tipo di dati per numeri immaginari; sono ancora numeri, ma non puoi davvero convertirli correttamente in un solo Int
.
In secondo luogo, quale tipo di firma preferiresti?
(+) :: (Num a, Num b) => a -> b -> a
(+) :: (Num a, Num b) => a -> b -> b
(+) :: (Num a, Num b, Num c) => a -> b -> c
Dopo aver considerato le altre opzioni, si rendono conto che a -> a -> a
è la scelta più semplice. I risultati polimorfici (come nel terzo suggerimento sopra) sono interessanti, ma a volte possono essere troppo generici per essere usati convenientemente.
In terzo luogo, Haskell non è Blub. La maggior parte, anche se forse non tutte, le decisioni di design su Haskell non tengono conto delle convenzioni e delle aspettative dei linguaggi popolari. Mi piace spesso dire che il primo passo per imparare Haskell è disimparare prima tutto ciò che pensi di sapere sulla programmazione. Sono sicuro che molti, se non tutti, gli esperti di Haskellers sono stati inciampati dalla classe numerica e da varie altre curiosità di Haskell, perché la maggior parte ha imparato prima un linguaggio più "mainstream". Ma sii paziente, alla fine raggiungerai il nirvana Haskell. :)
fonte
2011-11-25 01:35:01
Come dice il meme, "ha bisogno di più' daIntegral' ". –
Tipo di mi ricorda 'x.f()' vs 'g = x.f; g(); 'in Javascript. Fa schifo quando le variabili rompono l'astrazione del modello di sostituzione. – hugomg