Haskell:show和pretty-print实例

时间:2011-11-21 19:37:58

标签: haskell pretty-print

我在大学开始进行智能系统研究,我们的第一语言是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函数?我真的不知道从哪里开始。

我在这里读了几个类似的问题,但没有说明问题。如果有人能给我一些提示,建议,解决方案或其他什么,我真的很高兴!

2 个答案:

答案 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以及FractionalIntegral的实例。