Я хочу переопределить целочисленные конструкторы по умолчанию в Haskell, чтобы они производили строки (в основном из любопытства, но временно, чтобы сделать хорошую альтернативу вводу для неудобств LaTeX \frac{}{}).
Я хотел иметь возможность использовать сам язык вместо специального парсера, но я думаю, что это, вероятно, не сработает...
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
Проблема с вышеизложенным заключается в том, что функция + работает только для (A, A) вместо (A, String) и т. д. Если просто исключить соответствие шаблону «(A a)» и вместо этого написать «a», тогда функция show() добавляет «A», поэтому «3» становится «A 3», а не просто «3».
Я хочу переопределить Show для A, но это кажется довольно головной болью...