Voglio sovrascrivere i costruttori di numeri interi predefiniti in Haskell in modo da produrre stringhe (principalmente per curiosità, ma temporaneamente per fare una bella alternativa di input per l'inconveniente di \ frac {} {} di LaTeX.Come viene mostrato un override per un newtype?
volevo essere in grado di usare la lingua in sé, invece di un parser speciale, ma credo che probabilmente non è andare a lavorare fuori ...
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
Il problema con quanto sopra è che il + la funzione funziona solo per (A, A) anziché (A, String), ecc. Se si lascia semplicemente la corrispondenza del modello "(A a)" e si scrive "a", la funzione show() antepone "A" quindi "3" diventa "A 3" anziché solo "3".
voglio ignorare Show per A, ma sembra essere un bel mal di testa ...
Grazie, ma non è molto compositivo: 3 + 4 + 2 produce "" 3 + 4 "+ 2". Scusa per essere un principiante ... se conosci un modo per aggirare questo, lo apprezzerei molto! Grazie per aver evidenziato il problema principale - derivando Show. – gatoatigrado
Okay - ora penso di capire cosa stai cercando di fare. Vedi la mia seconda risposta. Gestirà correttamente 3 + 4 + 2. – MtnViewMark
È possibile utilizzare la classe di tipi Monoid per tale funzionalità "+". –