ghci> show (Left 3)
"Left 3"
ghci> show (Just 0)
"Just 0"
ghci> show (Just (Left 3))
"Just (Left 3)"
Haskell如何自动将括号放在嵌套的构造函数参数周围?
答案 0 :(得分:8)
showsPrec :: Int -> a -> ShowS
是show
内部使用的函数,用于在术语周围始终放置括号。
Int
参数表示外部上下文的优先级。如果当前构造函数的优先级大于上下文的优先级,showParen :: Bool -> ShowS -> ShowS
会在构造函数周围放置括号。这是一个非常基本的AST的例子:
data Exp = Exp :+: Exp
| Exp :*: Exp
-- The precedence of operators in haskell should match with the AST shown
infixl 6 :+:
infixl 7 :*:
mul_prec, add_prec :: Int
mul_prec = 7
add_prec = 6
instance Show Exp where
showsPrec p (x :+: y) = showParen (p > add_prec) $ showsPrec (add_prec+1) x
. showString " :+: "
. showsPrec (add_prec+1) y
showsPrec p (x :*: y) = showParen (p > mul_prec) $ showsPrec (mul_prec+1) x
. showString " :*: "
. showsPrec (mul_prec+1) y
show t = showsPrec 0 t "" -- Default definition
showsPrec
,showString
,showParen
等操作差异列表(ShowS = String -> String
),其中参数是附加到结果的字符串。连接是通过组合完成的,并通过带有空字符串的应用程序转换为String
。
show
实现使用具有最低优先级的showsPrec
,要打印的表达式,最后使用字符串[]
的结尾。