Haskell:show和pretty-print实例

Seb*_*ian 2 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)     
Run Code Online (Sandbox Code Playgroud)

好的,到目前为止.任务是为我们的函数实现一个漂亮的实例.即:

Plus ( Pot ( Var 2)) ( Num 3)

x^2 + 3

所以,我不知道"漂亮"是什么意思.在搜索互联网后,我发现"漂亮"只意味着以人类可读的形式重写输出.它是否正确?如果是,那对我的功能意味着什么?我是否必须用show功能替换该pretty功能?我真的不知道从哪里开始.

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

Mat*_*ick 5

是的,这就是漂亮印刷的意思.

基本上,你只需要一个将一个转换Expr a成一个函数的函数String:

myPrettyPrint :: Expr a -> String
Run Code Online (Sandbox Code Playgroud)

无论你想要什么,都要打电话,不要试图替换show.

为了实现此功能,您可能希望了解模式匹配.

  • @RomanGonzalez:`Show`是一种轻量级序列化的形式.虽然人们经常以这种方式滥用它,但它不适用于漂亮的打印.特别是,如果还定义了一个`Read`实例,那么应该能够期望`read.show`是身份功能. (5认同)
  • @leftaroundabout:只要遵循`show`应该是有效的Haskell语法规则,我就可以在一定程度上同意这一点.这对于与容器类型正确配合的实例是必要的.例如,一个`Show`实例不应该返回`"] foo ["`,因为如果你把它放在一个列表中会破坏它.这并不意味着它必须对应于编译器派生的实例.例如,`Data.Set`的`Show`实例返回`"fromList [...]"`,因此它不公开特定于实现的树结构. (2认同)