2013-03-12 11 views
10

So che c'è fst e snd, ma perché non esiste una definizione "generale" per tali funzioni di accesso utilizzando le classi di tipi? Vorrei suggerire qualcosa di similePerché non ci sono funzioni di accesso "generali" per le tuple in Haskell?

class Get1 p a | p -> a where 
    get1 :: p -> a 

instance Get1 (a,b) a where 
    get1 (x,_) = x 

instance Get1 (a,b,c) a where 
    get1 (x,_,_) = x 

class Get2 p a | p -> a where 
    get2 :: p -> a 

instance Get2 (a,b) b where 
    get2 (_,x) = x 

instance Get2 (a,b,c) b where 
    get2 (_,x,_) = x 

Certo, avete bisogno di alcune estensioni del linguaggio di questo, ma non è questo molto più conveniente in quel modo? Soprattutto è possibile aggiungere istanze per i propri tipi.

+4

Queste e altre tuple sono disponibili nel pacchetto [tuple] (http://hackage.haskell.org/package/tuple). – is7s

+0

@ is7s Grazie, non sapevo di questo – Landei

+9

La risposta è probabilmente "perché nessuno usa tuple molto". Certamente non di grandi dimensioni, comunque. – MathematicalOrchid

risposta

6

Una cosa da notare è che fst e snd consentono solo di visualizzare una tupla di 2 elementi. Generalizzarli in altre aule e operazioni diventa rapidamente doloroso. Se vuoi anche, per esempio, mappare sul primo elemento di una tupla, devi introdurre un altro combinatore (che, per la cronaca, esiste per le 2-tuple come Control.Arrow.first). Ciò porta rapidamente ad un'esplosione del numero di combinatori per tuple di alta aritmetica.

Detto questo, lens fornisce alcuni strumenti utili per lavorare con le tuple. Control.Lens.Tuple fornisce varie lenti indice _1, _2, ecc che consentono l'accesso alla prima, seconda, ecc elementi di tuple fino a arity 9.

Ad esempio,

>>> import Control.Lens 
>>> let t = (1,2,3,5,6,7,2) 
>>> t ^._1 
1 
>>> t & _1 .~ 'a' 
('a',2,3,5,6,7,2) 
>>> t & _1 +~ 41 
(42,2,3,5,6,7,2) 
>>> over _1 (+1) t 
(2,2,3,5,6,7,2) 

Si può anche essere interessato alle istanze di tupla in Control.Lens.At. Inoltre, il package fornisce alcuni obiettivi più generali per esaminare più voci di tupla contemporaneamente.

3

Tali classi di tipi forniscono solo la convenienza di codifica (sintassi), non vedo come creare su di esse strumenti di tipo tupla generalizzati. Se stai cercando la generalizzazione delle tuple, controlla the discussion about heterogeneous vectors su Reddit.

Si noti inoltre che per le strutture ordinarie è preferibile definire i propri ADT e fornire ai getter nomi sensibili quindi utilizzare tuple di alta qualità.

Modifica: tuttavia, come is7s puntato nel commento, c'è un numero di pacchetti su hackage che forniscono funzioni di indicizzazione per tuple di lunghezza arbitraria.

+1

No, il pacchetto cui ho fatto riferimento non è implementato usando 'TemplateHaskell'. Il modulo 'Data.Tuple.Select' è implementato in modo simile a ciò che l'OP ha fatto. – is7s

Problemi correlati