我想在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/