gpt4 book ai didi

haskell - 将自定义数据类型转换为字符串

转载 作者:行者123 更新时间:2023-12-04 14:23:24 24 4
gpt4 key购买 nike

如果我有三种名为 Expr 的数据类型, OpFu像这样。

data Expr = Num Double
| X
| Operator Op Expr Expr
| Function Fu Expr
deriving (Eq)

data Op = Add | Mul
deriving (Eq)

data Fu = Sin | Cos
deriving (Eq)

我应该做的是稍后根据数据类型创建一个表达式。例如
let anExpr = Add (Num 3.0) (Num 4.0)

而不是打印出相应的表达式,在这种情况下它应该只是“3.0+4.0”。

我面临的问题是创建另一种类型或数据类型来识别它是应该打印出来的加法还是乘法符号。我想做的是在伪代码中这样的事情
printOut (Num n) = show n
printOut X = "x"
printOut (Op a b) = printOut a ++ 'printOutRightOp' ++ printOut b
printOut (Fu a) = 'printOutRightFu' ++ printOut a

我该怎么做?

最佳答案

不能将类型的引用写入构造函数名称 .在您的代码中:

data Expr = Num Double
| X
| Op Expr Expr
| Fu Expr
deriving (Eq)
OpFu构造函数的名称 . Haskell 认为存在同名类型,这只是一个巧合。您必须 添加运算符/函数的类型作为第一个参数 .所以:
data Expr = Num Double
| X
| Op Op Expr Expr
| Fu Fu Expr
deriving (Eq)

现在第二个 OpFu指定第一个参数的类型。

现在你必须更换你的:
let anExpr = Add (Num 3.0) (Num 4.0)

和:
let anExpr = Op Add (Num 3.0) (Num 4.0)

基于此,我们可以定义一些辅助函数:
showOp :: Op -> String
showOp Add = "+"
showOp Mul = "*"

showFu :: Fu -> String
showFu Sin = "sin"
showFu Cos = "cos"

现在我们可以在定义 showExpr 时使用这些辅助函数。 (我不会称它为 printOut ,因为该函数不打印任何内容,它只生成一个字符串,您可以使用该字符串做任何您想做的事情)。
showExpr :: Expr -> String
showExpr (Num n) = show n
showExpr X = "x"
showExpr (Op o a b) = '(' : showExpr a ++ ')' : showOp o ++ '(' : showExpr b ++ ")"
showExpr (Fu f a) = showFu f ++ '(' : showExpr a ++ ")"

例如:
*Main> showExpr (Op Add (Num 3.0) (Num 4.0))
"(3.0)+(4.0)"
*Main> showExpr (Op Add (Num 3.0) (Fu Sin (Num 4.0)))
"(3.0)+(sin(4.0))"

关于haskell - 将自定义数据类型转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46650775/

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