将数据类型转换为字符串以显示而不显示`show`

时间:2019-04-22 22:10:08

标签: haskell

这个问题让我感到非常困惑。目标是采用特定的数据类型并使用它来创建字符串。数据类型为:

data Math = Val Int
           | Add Math Math
           | Sub Math Math
           | Mult Math Math
           | Div Math Math
    deriving Show

此示例:

ex1 :: Math
ex1 = Add1 (Val1 2) (Val1 3)

应使用正确的代码输出"2 + 3"

我编写了以下代码,意识到自己遇到了两个问题:

show :: Math -> String
show (Val n)        = show n
show (Add e1 e2)    = show e1 ++ " + " ++ show e2
show (Sub e1 e2)    = show e1 ++ " - " ++ show e2
show (Mult e1 e2)   = show e1 ++ " * " ++ show e2
show (Div e1 e2)    = show e1 ++ " / " ++ show e2

曲线球是,函数必须按原样命名为show-因此,从Prelude调用show无效。我的第一个想法是创建一个将每个值转换为文字的助手,但是同样,我不知道在没有show数据类型的情况下如何做到这一点。我完全不知道该朝哪个方向前进。

2 个答案:

答案 0 :(得分:3)

您快到了!要使Main不受前奏的干扰,请添加

main = putStrLn $ Main.show (Val 3)

在文件顶部。

但是,毕竟,您将需要访问Prelude的show,以便可以在import Prelude hiding (show) 中显示show。因此,添加以下内容:

Int

使用这两行,您可以编写:

Val

您应该拥有想要的东西。


或者,如果您想实现import qualified Prelude (show) 这个类而不是一个独立的(同样(令人困惑))名为show :: Math -> String show (Val n) = Prelude.show n show (Add e1 e2) = show e1 ++ " + " ++ show e2 show (Sub e1 e2) = show e1 ++ " - " ++ show e2 show (Mult e1 e2) = show e1 ++ " * " ++ show e2 show (Div e1 e2) = show e1 ++ " / " ++ show e2 的函数,则Show的代码按原样工作。您只需要将其放在实例定义中,如下所示:

show

答案 1 :(得分:1)

您可以禁用true定义的false方法:

show

,或者您可以显式引用模块中定义的Show。假设它是在import Prelude hiding (show) 中定义的,

show