Haskell:显示和漂亮打印实例

问题描述 投票:0回答:2

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

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

haskell pretty-print
2个回答
7
投票

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

基本上,您只需要一个将

Expr a
转换为
String
的函数:

myPrettyPrint :: Expr a -> String

随便你怎么称呼它,不要试图替换

show

为了实现此功能,您可能需要了解模式匹配


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,not意味着
show
应该始终表现得像派生实例,而不是如果这个输出在没有haskell代码作为上下文的情况下观看时可读性较差、更长和/或不太清晰。


哈马尔在上面的评论中提出的另一点:

show
的输出应该是有效的haskell代码。为了使我的解决方案符合您需要使
Expr
成为
Num
Fractional
Integral
的实例。

© www.soinside.com 2019 - 2024. All rights reserved.