後置式をバイナリツリーに変換しようとしています。私の関数は引数としてトークン(文字列)のリストをとります。Haskell - バイナリツリーに後置式を変換する
私は関数に任意の入力を与えるたびに、デバッガはメッセージを書き込みます。関数 "add"の非網羅的パターン。
私の考えは、トークンの後のトークンを読んで、それがオペレータかオペランドかを判断することでした。オペランドの場合は、ノードをツリーに保存せずにスタックに格納してください。それ以外の場合は、演算子を持つノードを作成し、スタックからシンボルをポップし、それらを新しいノードの子として設定し、演算子をスタックにプッシュします。
文字列のリストが空の場合、関数はバイナリツリーを出力します。
誰かが私に説明してくれるのですが、その機能が非網羅的なパターンエラーをもたらす理由とその機能をどうやって解決できるのでしょうか?
私は簡単な例でエラーを再現するために管理してきましたdata Tree = Leaf String | Empty | Node Tree String Tree deriving (Show)
add :: Tree -> [String] -> [Tree] -> Tree
add (Node l v p) [] stack = (Node l v p)
add Empty (x:xs) []
| x `elem` ["*","-","+"] = add (Leaf x) xs [Leaf x]
| otherwise = add Empty xs [Leaf x]
add Empty (x:xs) (a:b:bs)
| x `elem` ["*","-","+"] = add (Node b x a) xs (Leaf x:a:b:bs)
| otherwise = add Empty xs (Leaf x:a:b:bs)
add (Leaf x) token (a:b:bs)
| x `elem` ["*","-","+"] = add (Node b x a) token (Leaf x:bs)
| otherwise = Leaf x
add (Node l v p) (x:xs) (a:b:bs)
| x `elem` ["*","-","+"] = add (Node b x a) xs (Leaf x:bs)
| otherwise = add (Node l v p) xs (Leaf x:a:b:bs)
parse :: String -> Tree
parse input = add Empty (words (toPostfix input)) []
'Empty [] x'を追加するのはどうですか?または 'add(Leaf x)token []'? 'add'自体で起こりうる_all_パターンをキャプチャしたことは確かですか? – Zeta
あなたは: 'Empty [] stack = Empty'を追加しますか? – Mafi
私はパターンのコードを書こうとします: 'add(Leaf x)token []' – Mafi