新类型的一个覆盖如何显示?

2024-03-15

我想重写 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,但似乎很头疼......


如果你想要自己的Show实例为A,那么就不要派生它并创建自己的实例:

newtype A = A Int deriving (Eq, Num)

instance Show A where
  show (A a) = show a

然后你可以写这样的东西:

(+) :: (Show a, Show b) => a -> b -> String
a + b = show a ++ " + " ++ show b

当然,如果你自己定义+像那样的运算符,那么我认为你的问题不需要newtype A宣言:

module Main where

import Prelude hiding ((+))

(+) :: (Show a, Show b) => a -> b -> String
a + b = show a ++ " + " ++ show b

aSum = 3 + 4

main :: IO ()
main = putStrLn aSum
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

新类型的一个覆盖如何显示? 的相关文章

随机推荐