Как переопределить показ для нового типа?

Я хочу переопределить целочисленные конструкторы по умолчанию в Haskell, чтобы они производили строки (в основном для любопытства, но временно, чтобы сделать хорошую альтернативу ввода для неудобства \ frac {} {} в LaTeX).

Я хотел иметь возможность использовать сам язык вместо специального синтаксического анализатора, но я думаю, что это, вероятно, не сработает ...

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, но это, кажется, довольно головная боль ...

Ответы на вопрос(3)

Ваш ответ на вопрос