gpt4 book ai didi

关于显示实例的 Haskell 发生错误

转载 作者:行者123 更新时间:2023-12-05 09:29:48 24 4
gpt4 key购买 nike

data Expr = Var Char | Not Expr | And Expr Expr | Or Expr Expr deriving (Eq, Ord)


instance Show Expr where
show (Var x) = [x]
show (Not (Var y)) = "~"++ show (Var y)
show (And (Var x) (Var y)) = show (Var x) ++ " ^ " ++ show (Var y)
show ((Or (Var x) (Var y))) = show (Var x) ++ " v " ++ show (Var y)
show (Not (Or (Var x) (Var y))) = "~(" ++ show (Or (Var x) (Var y)) ++ ")"
show (And (Var x) (And (Var y) (Var z))) = show (Var x) ++ " ^ " ++ "(" ++ show (And (Var y) (Var z)) ++ ")"

我不确定为什么在运行时会出现此错误:

>(Not (Not (Var 'a')))
*** Exception: (21,5)-(26,112): Non-exhaustive patterns in function show

谁能帮帮我。

最佳答案

And 也可以包含另一个 And,例如 And (And (Var 'x') (Var 'y')) (Var ' z')。在您的 Show 实例中,您始终假设参数是 Var,这是不必要的。

您可以将 Show 实例实现为:

instance Show Expr where
show (Var x) = [x]
show (Not <strong>x</strong>) = "~ ("++ show <strong>x</strong> ++ ")"
show (And <strong>x</strong> <strong>y</strong>) = "(" ++ show <strong>x</strong> ++ " ^ " ++ show <strong>y</strong> ++ ")"
show (Or <strong>x</strong> <strong>y</strong>) = "(" ++ show <strong>x</strong> ++ " v " ++ show <strong>y</strong> ++ ")"

这会引入很多括号。因此,最好使用优先级参数。事实上 Show 实例已经支持这个:你可以使用 showsPrec :: Int -> a -> String -> String .这里的Int参数是外层上下文的运算符优先级,第一个String参数是需要追加在末尾的字符串: 出于性能原因这样做。

因此我们可以将其实现为:

instance Show Expr where
<strong>showsPrec</strong> n (Var x) = (x :)
<strong>showsPrec</strong> n (Not x) = showParen (n > 9) ( ('~' :) . showsPrec 10 x)
<strong>showsPrec</strong> n (And x y) = showParen (n > 8) ((showsPrec 9 x) . (" ^ " ++) . showsPrec 9 y)
<strong>showsPrec</strong> n (Or x y) = showParen (n > 7) ((showsPrec 8 x) . (" v " ++) . showsPrec 8 y)

如果外层countext的优先级高于9,我们将在not时显示括号,并调用优先级为10的showPrec这样里面的 showPrec 就不会打印额外的括号,除非它的优先级为 10 或更高。这同样适用于其他功能。

这意味着我们可以打印带有括号的表达式,例如:

ghci> show (Not (And (Or (Not (Var 'x')) (Var 'y')) (Var 'z')))
"~((~x v y) ^ z)"

这里 And … … 将因此打印括号,因为它以 9 的优先级调用,并且打印括号的阈值是 8。但是 ~x 周围没有括号,因为阈值低于 10。

关于关于显示实例的 Haskell 发生错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70382293/

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