Come estensione di Haskell standard, è possibile gestire "tipi". I tipi sono un tipo di sistema di base molto semplice per i costruttori di tipi e tipi. Il tipo *
è un tipo semplice, ad esempio Int
. Il tipo * -> *
è un costruttore di tipi che accetta un tipo e produce un tipo, ad esempio Maybe
: passa un tipo come Int
come argomento e ottieni il tipo Maybe Int
.
L'altra estensione utilizzata in questo codice (che non ho notato all'inizio, poiché il rientro è stato perso) è associata ai tipi. Un typeclass in Haskell standard può specificare un numero di funzioni che il tipo deve supportare. Con i tipi associati, può inoltre specificare tipi e costruttori di tipi associati al tipo.
Qui, questo significa che un tipo i
che è un'istanza di Imageable
(cioè comporta come un'immagine) deve avere un tipo di pixel associato Pixel i
, e questo deve essere un tipo semplice (tipo *
), non è un tipo di costruzione.
fonte
2014-04-02 10:03:47
Sai perché l'autore del codice usa questo disegno? – osager
Non c'è molta scelta. Hai un tipo di tipo che rappresenta un'immagine, e la classe di caratteri richiede delle funzioni che si occupano di un singolo pixel nell'immagine. Hai bisogno di un modo per scoprire quale sia il tipo di quel pixel. Puoi sistemarlo, ma non è molto flessibile. Potresti rendere Imageable un typeclass multi-param sull'immagine e il suo pixel, ma poi hai bisogno di dipendenze funzionali o di tipo ambiguities ti farà impazzire, e devi ancora menzionare il tipo di pixel in ogni firma che usa la classe. I tipi associati sono molto più puliti e più facili. –