我想在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 for A,但似乎很头疼...

最佳答案

如果您想要自己的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

关于haskell - 如何覆盖一种新类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2660778/

10-12 17:28
查看更多