这个问题让我感到非常困惑。目标是采用特定的数据类型并使用它来创建字符串。数据类型为:
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
数据类型的情况下如何做到这一点。我完全不知道该朝哪个方向前进。
答案 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