我在一所大学开始学习智能系统,我们的第一语言是 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
函数?我真的不知道从哪里开始。
我在这里阅读了几个类似的问题,但没有明白其中的要点。如果有人能给我一些提示、建议、解决方案或其他什么,我真的很高兴!
是的,这就是漂亮印刷的意思。
基本上,您只需要一个将
Expr a
转换为 String
的函数:
myPrettyPrint :: Expr a -> String
随便你怎么称呼它,不要试图替换
show
。
为了实现此功能,您可能需要了解模式匹配。
我只是相应地实现
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,not意味着show
应该始终表现得像派生实例,而不是如果这个输出在没有haskell代码作为上下文的情况下观看时可读性较差、更长和/或不太清晰。
哈马尔在上面的评论中提出的另一点:
show
的输出应该是有效的haskell代码。为了使我的解决方案符合您需要使 Expr
成为 Num
和 Fractional
或 Integral
的实例。