我想重写 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"。
我想覆盖 A 的 Show,但这似乎是一个相当棘手的问题...