Supongamos que quisiera crear un nuevo tipo de datos y mostrar los constructores, solo en minúsculas en lugar de su definición en mayúscula. Por ejemplo:Cómo mostrar un constructor en minúsculas
data Day = Monday | Tuesday | Wednesday| Thursday | Friday | Saturday | Sunday
Mediante la adición de derivar Mostrar, ghci imprimiría ellos como "los lunes, martes, etc .." Para conseguirlo para mostrar "lunes, martes, etc .." He tratado de hacer un caso especial de espectáculo:
import Data.Char
strToLower :: [Char] -> [Char]
strToLower (x:xs) = toLower x : strToLower xs
strToLower [] = []
instance Show Day where
show d = strToLower (show d)
donde la primera aparición del espectáculo debe designar a mi nueva función de presentación de enmiendas (que se denominará cada vez que imprimo), mientras que para el segundo intento utilizar la versión de show normalmente derivada, para pasar del nombre del constructor a una Cadena.
Por supuesto, esto no funciona (definición circular) ya que el ghci no tiene ni idea de mis significados por separado de la palabra "mostrar", pero no entiendo cómo hacerle saber la distinción, ya que ambas versiones necesitan ser nombrado show, el primero porque a eso es a lo que llama la impresión y el segundo porque es una función haskell predefinida que puede darme una cadena de un nombre de constructor. He intentado
show d = strToLower ((showsPrec 0 d) "")
pero esto se reduce a la misma definición circular, al menos eso es lo que supongo que desde el ghci quedar atrapado en un bucle.
Entiendo por qué los nombres de los constructores deben comenzar con una letra mayúscula, pero mostrarlos en minúscula no debería ser un problema, ¿o sí? Sé que podría definir mi función de presentación para cada caso por separado, p. Ej. show Monday = "monday"
show Tuesday = "tuesday"
etc., pero solo estoy usando los días de la semana como ejemplo y mi tipo de datos real consta de 64 constructores, por lo que creo que sería más elegante resolverlo de manera diferente de alguna manera.
¿Es posible profundizar en la definición de haskell de mostrar y modificar una copia de ese código? Esta es la única solución posible que se me ocurre, pero no sé cómo hacerlo, si es posible. Probablemente no. ¡Entonces otras soluciones también son bienvenidas!
Gracias por tomar su tiempo,
Jelle (principiante Haskell)
¿Por qué no puedes escribir 'showDay day = map to Low. show' y use 'showDay' en lugar de' show'? – dave4420
Además de las otras respuestas, podría valer la pena responder a su pregunta directa (¿cómo puedo usar el 'show' derivado para implementar mi propio' show'?), Para lo cual la respuesta es "no se puede". Es una regla fundamental de Haskell que cada clase pueda tener en la mayoría de una instancia para un tipo dado. –