2011-09-19 16 views
7

Mi sono appena imbattuto nel pacchetto OneTuple sulla confezione. Voglio sapere che è uno scopo, sono certo che l'autore non l'ha creato solo per il gusto di farlo. Quindi quando può essere utile? È abbastanza chiaro cosa fa, ma non quando lo si userebbe.Quando si vorrebbe usare OneTuple?

Quindi, qualcuno sa qualche esempio interessante quando si può beneficiare di questo? O forse mostrare la bellezza matematica dietro di esso?

+1

"Sono certo che l'autore non l'ha creato solo per il gusto di farlo" - potresti sottovalutare il senso dell'umorismo della comunità di Haskell qui. – MatrixFrog

+0

Che cosa ha detto la rana. Vedi la categoria del pacchetto acme per esempi di pacchetti senza una vera ragione per esistere. –

risposta

3

È quasi la stessa della Identity Monade, che è comunemente usato come base di una pila trasformatore Monade, tranne che dal OneTuple utilizza data invece di newtype ha un valore inferiore aggiuntivo.

È interessante perché è in un certo senso l'esempio più banale della maggior parte delle classi di tipi implementate. Però non ne vedo un uso pratico.

+2

Vedo solo un uso pratico nella creazione di un ulteriore livello di riferimento indiretto, ad esempio per proteggere il thunk interno da valutazione. – fuz

2

Penso che sia qualcosa di uno scherzo, come il pacchetto don't. Detto questo, OneTuple aggiunge un nuovo valore singolo a qualsiasi tipo (al contrario di Maybe, che ne aggiunge due: Nothing e Just undefined o undefined a seconda di come oscilla la tua barca). Quindi, se dovesse risultare necessario, sai dove andare ...

+0

'don't' sembra essere abbastanza utile per scopi di debug, ad esempio se si desidera" commentare "alcune operazioni monadiche. – fuz

+2

Io uso l'operatore '--' per questo :-) – sclv

4

Supponiamo che tu abbia una tipa (un po 'sciocca) che opera su tuple. Hai un'istanza per (a,a), un'istanza per (a,a,a). Vuoi anche un'istanza per un singolo valore. Ma non puoi creare un'istanza per a perché si sovrapporrebbe a tutto il resto! Tuttavia, è possibile creare un'istanza per OneTuple a.

Ora che il typeclass è un po 'inutile, ma è facile immaginare un typeclass quasi come esso ma più utile. In realtà, questo è proprio l'uso di Only nella libreria MySQL bos': http://hackage.haskell.org/packages/archive/mysql-simple/0.2.0.2/doc/html/Database-MySQL-Simple-QueryResults.html

3

Questo è certamente non uno scherzo, proprio come l'implementazione di identità monade, non è uno scherzo. A differenza del semplice tipo a si ottengono tutte le istanze utili e si ottiene il fondo aggiuntivo, che porta la tupla singleton molto più vicina alla semantica degli altri tipi di tupla.

Un caso d'uso per questo è, proprio come la monade identità, la generalizzazione. Hai una funzione applicativa/monadica, che ha un tipo di functor polimorfico. Ad esempio, molti pacchetti utili come il supporto dell'enumeratore operano su una monade scelta dall'utente. La semantica leggermente diversa di OneTuple (rispetto a Identity) può essere molto utile, quando si hanno complicate dipendenze dei dati o si vuole fare uso della pigrizia aggiuntiva, che non è fornita da Identity.

Problemi correlati