Viniendo a Haskell desde un fondo en varios lenguajes de OO, una cosa que me parece un inconveniente es que la función y los nombres de campo no tienen el alcance de los tipos que están asociados, por lo que es fácil encontrarse con enfrentamientos si los diferentes tipos de datos tienen campos con el mismo nombre.Choques de nombres entre etiquetas de campo de diferentes tipos de datos en Haskell
Si tengo estos tres módulos:
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
las referencias no calificadas a value
en el módulo Three
se consideran ambigua pesar de que sólo uno de los dos nombres importados tiene sentido en este contexto. (En un lenguaje orientado a objetos, las referencias a foo.value
y bar.value
serían sin ambigüedades.)
Por supuesto que puedo eliminar la ambigüedad escribiendo Foo { One.value = 42 }
, pero que no augura nada bueno. También puedo nombrar los campos de manera diferente, p. "fooValue" y "barValue", pero la redundancia en Foo { fooValue = 42 }
parece incómoda también.
Este es realmente un caso especial de la cuestión más general de funciones en diferentes módulos que tienen el mismo nombre pero operan en diferentes tipos no relacionados. Sin embargo, parezco encontrarlo más a menudo con los nombres de los campos. Por ejemplo, tengo varios tipos de datos, no relacionados por una clase de tipo pero que a menudo se usan juntos, que contienen valores de color, por lo que me gustaría que cada uno tenga un campo llamado "color".
¿Cómo nombran los desarrolladores experimentados de Haskell cosas y los organizan en módulos para evitar este tipo de situaciones?
Punto menor: le falta el constructor en su definición de 'Bar'. –
@Travis Brown: Vaya, eso fue un error tipográfico. Gracias por mencionarlo. – Wyzard