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

标签 haskell show typeclass

我想覆盖 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”,而不仅仅是“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

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

相关文章:

html - 这是如何以及为什么起作用的?

haskell - 类型类实例内的类型类约束

typeclass - 将命名实例用于其他实例

haskell - 流融合在 Haskell 中是如何工作的?

haskell - 在模板 haskell 中执行类型相等

jQuery 悬停时显示,鼠标移开时隐藏

haskell - 类型类约束的存在量化

multithreading - 如何使用安全异常库捕获异步异常?

haskell - 使用 Pipes 的简单程序挂起

jquery .show ('slow' )方向?