我在大学开始进行智能系统研究,我们的第一语言是Haskell。我必须承认到目前为止我并不熟悉它。本周的部分任务是开发一个代数数据类型Expr a
,它代表基本的算术运算(+,-,*,/)
。
解决方案IMO应该是:
module Expression where
data Expr a = Number a |
Var |
Sum (Expr a) (Expr a) |
Prod (Expr a) (Expr a) |
Div (Expr a) (Expr a) |
Pot (Expr a) a
deriving (Show)
好的到目前为止。任务是为我们的函数实现一个漂亮的实例。即:
这
Plus ( Pot ( Var 2)) ( Num 3)
到
x^2 + 3
所以,我不知道“漂亮”是什么意思。在搜索互联网后,我发现“漂亮”只意味着以人类可读的形式重写输出。它是否正确?如果是,那对我的功能意味着什么?我是否必须使用show
函数替换pretty
函数?我真的不知道从哪里开始。
我在这里读了几个类似的问题,但没有说明问题。如果有人能给我一些提示,建议,解决方案或其他什么,我真的很高兴!
答案 0 :(得分:5)
是的,那就是漂亮的印刷品。
基本上,您只需要一个将Expr a
转换为String
的函数:
myPrettyPrint :: Expr a -> String
随意调用它,不要试图替换show
。
为了实现此功能,您可能希望了解模式匹配。
答案 1 :(得分:1)
我只是相应地实现show
(而不是从中推导出来),至少如果你不介意包含不必要的括号,这可以很容易地完成:
instance (show a) => show (Expr a) where
show (Number x) = show x
-- ...
show (Prod x y) = "("++show x++")*("++show y++")"
-- ...
这可以做得更好,效率更高,但也许这个解决方案对您来说已经足够了。
上面的评论中说show
应该是序列化的轻量级手段,尤其应该满足(read . show) x = x
。我同意,这意味着你应该,例如,你不应该做任何实际的漂亮的东西(比如输出到LaTeX,这肯定是输出这些数据的好方法)。它确实,IMO,不意味着show
应该总是像派生实例一样,如果没有haskell代码观看这个输出的可读性更低,更长,和/或更不清晰作为背景。
上面评论中的另一个点是:show
的输出应该是有效的haskell代码。为了使我的解决方案符合您的要求,您需要Expr
Num
以及Fractional
或Integral
的实例。