Arrivando a Haskell da uno sfondo in vari linguaggi OO, una cosa che mi sembra un po 'un inconveniente è che i nomi di funzione e campo non sono legati ai tipi che essi sei associato, quindi è facile imbattersi in scontri se diversi tipi di dati hanno campi con lo stesso nome.Nome in conflitto tra etichette di campo di tipi di dati diversi in Haskell
Se ho questi tre moduli:
module One where
data Foo a = Foo { value :: a }
----
module Two where
data Bar a = Bar { value :: a }
----
module Three where
import One
import Two
foo = Foo { value = 42 } -- compile error here
n = value foo -- and here
i riferimenti non qualificati a value
nel modulo Three
sono considerati ambigui, anche se solo uno dei due nomi importati ha senso in questo contesto. (In un linguaggio OO, i riferimenti a foo.value
e bar.value
sarebbe ambigua.)
Certo che posso disambiguare scrivendo Foo { One.value = 42 }
, ma che sembra imbarazzante. Posso anche denominare i campi in modo diverso, ad es. "fooValue" e "barValue", ma la ridondanza in Foo { fooValue = 42 }
sembra imbarazzante.
Questo è davvero un caso particolare del problema più generale delle funzioni in diversi moduli che hanno lo stesso nome ma operano su tipi diversi, non correlati. Mi sembra di imbattermi più spesso con i nomi dei campi, però. Ad esempio, ho diversi tipi di dati, non correlati da una classe di tipo ma spesso usati insieme, che contengono valori di colore, quindi mi piacerebbe che ognuno di essi avesse un campo chiamato "colore".
In che modo gli sviluppatori Haskell esperti hanno il nome delle cose e le organizzano in moduli, per evitare questo tipo di situazione?
Punto minore: manca la funzione di costruzione nella definizione di "Barra". –
@Travis Brown: Oops, quello era un errore di battitura. Grazie per segnalarlo. – Wyzard