haskell-jp / beginners #15 at 2021-04-19 22:53:35 +0900

こんばんは。Haskellで以下の振る舞いをするコードを書こうとしています。
ghci> Val 1   
1
ghci> Var 2 3 
x 23
ghci> Plus [Val 1, Var 2 3]
(+ 1 x23)

そこで以下のようなコードを書いてみました。
data Exp = Var Int Int | Val Int | Plus [Exp]
instance Show Exp where
    show (Var i j) = "x" ++ show i ++ show j
    show (Val n) = show n
    show (Plus (exp1:exp2:exp)) = "(+" ++ " " ++ show exp1 ++ " " ++ show exp2 ++ ")"

これでも(おそらく)正しく動いているのですが、VSCode上で以下のように注意されます。
Pattern match(es) are non-exhaustive
In an equation for 'show':
    Patterns not matched:
        Plus [(Var _ _)]
        Plus [(Val _)]
        Plus [(Plus _)]
        Plus []

パターンマッチが網羅的では無いのですが、具体的にどう書けば良いか分かりませんでした。
どう書けば網羅的になるのか、ご教示いただけると嬉しいです。よろしくお願いいたします。
Plus [] , Plus [Var 1 2], Plus [Var 1 1, Var 1 2, Var 1 3], などの可能性はあるものとしたいですか? ないものとしたいですか?
出てきているのがLisp式なので,
Plus [] -> "(+)"
Plus [Var 1 2] -> "(+ x12)"
Plus [Var 1 1, Var 1 2, Var 1 3] -> "(+ x11 x12 x13)"

とする,としても不自然ではないようにおもいますが….
ご返信ありがとうございます。
可能性はあるものとしたいですか? ないものとしたいですか?
ないものとしたいです。
もしかして
data Exp = Var Int Int | Val Int | Plus Exp Exp
instance Show Exp where
  show (Var i j) = "x" ++ show i ++ show j
  show (Val n) = show n
  show (Plus e1 e2) = "(+" ++ " " ++ show e1 ++ " " ++ show e2 ++ ")"

これで表現できるのでしょうか…?
はい,それで表現できています!
なるほど、納得しました!お騒がせして申し訳ございません。
ありがとうございました!