Quiero anular los constructores de enteros predeterminados en Haskell para que produzcan cadenas (principalmente por curiosidad, pero temporalmente para hacer una buena alternativa de entrada para el inconveniente de LaTeX \ frac {} {}).¿Cómo se puede omitir para un nuevo tipo?
que quería ser capaz de utilizar el lenguaje en sí mismo, en vez de un programa de análisis especial, pero supongo que probablemente no va a funcionar ...
module Main where
import Prelude hiding ((+))
newtype A = A Int deriving (Eq, Show, Num)
default (A)
(+) :: A -> (A -> String)
(A a) + (A b) = (show a) ++ " + " ++ (show b)
main2 = 3+4
main :: IO()
main = putStrLn main2
El problema con lo anterior es que el + la función solo funciona para (A, A) en lugar de (A, String), etc. Si uno simplemente deja de lado la coincidencia de patrón "(A a)" y escribe "a", la función show() antepone "A" entonces "3" se convierte en "A 3" en lugar de solo "3".
Quiero anular Mostrar para A, pero parece ser un dolor de cabeza ...
Gracias, pero no es muy compositivo: 3 + 4 + 2 rinde '' 3 + 4 '' + 2 '. Perdón por ser un novato ... si conoce una forma de evitar esto, ¡lo agradecería mucho! Gracias por señalar el problema principal: derivar Show. – gatoatigrado
Bien, ahora creo que entiendo lo que estás tratando de hacer. Ver mi segunda respuesta. Manejará 3 + 4 + 2 correctamente. – MtnViewMark
Puede usar la clase de tipos Monoid para esa funcionalidad "+". –