gpt4 book ai didi

haskell - 将数据类型转为String进行显示,不带 `show`

转载 作者:行者123 更新时间:2023-12-02 18:27:43 24 4
gpt4 key购买 nike

这个问题让我百思不得其解。目标是采用特定的数据类型并使用它来创建字符串。数据类型为:

data Math = Val Int
| Add Math Math
| Sub Math Math
| Mult Math Math
| Div Math Math
deriving Show

这个例子:

ex1 :: Math
ex1 = Add1 (Val1 2) (Val1 3)

应该使用正确的代码输出“2 + 3”

我编写了以下代码并意识到我遇到了两个问题:

show :: Math -> String
show (Val n) = show n
show (Add e1 e2) = show e1 ++ " + " ++ show e2
show (Sub e1 e2) = show e1 ++ " - " ++ show e2
show (Mult e1 e2) = show e1 ++ " * " ++ show e2
show (Div e1 e2) = show e1 ++ " / " ++ show e2

问题是该函数必须命名为 show,因为它就是这样 - 因此从 Prelude 调用 show 将不起作用。我首先想到的是创建一个帮助程序,将每个值转换为文字,但同样,我不知道如何在没有 show 数据类型的情况下做到这一点。我确实不知道该朝哪个方向前进。

最佳答案

你就快到了!为了防止 Prelude 中的 show 受到干扰,请添加

import Prelude hiding (show)

到文件顶部。

但是,您毕竟需要访问 Prelude 的 show,以便可以在 Val 中显示 Int。所以还要添加以下内容:

import qualified Prelude (show)

通过这两行,您可以编写:

show :: Math -> String
show (Val n) = Prelude.show n
show (Add e1 e2) = show e1 ++ " + " ++ show e2
show (Sub e1 e2) = show e1 ++ " - " ++ show e2
show (Mult e1 e2) = show e1 ++ " * " ++ show e2
show (Div e1 e2) = show e1 ++ " / " ++ show e2

你应该得到你想要的。

<小时/>

或者,如果您想实现 Show 类,而不是独立的、相同(并且容易混淆)命名的 show 函数,则可以使用 的代码show 按原样工作。您只需将其放入实例定义中,如下所示:

instance Show Math where
show (Val n) = show n
-- etc...

关于haskell - 将数据类型转为String进行显示,不带 `show`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55801749/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com