2017-08-21 7 views
1

後置式をバイナリツリーに変換しようとしています。私の関数は引数としてトークン(文字列)のリストをとります。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)) [] 
+1

'Empty [] x'を追加するのはどうですか?または 'add(Leaf x)token []'? 'add'自体で起こりうる_all_パターンをキャプチャしたことは確かですか? – Zeta

+0

あなたは: 'Empty [] stack = Empty'を追加しますか? – Mafi

+0

私はパターンのコードを書こうとします: 'add(Leaf x)token []' – Mafi

答えて

2

add Empty ["10", "1", "+"] [] 

プログラムが正常にスタックにLeaf "10"が追加されますが、addが呼び出されるため、スタックにLeaf "1"を追加することはできません。

add Empty ["1", "+"] [Leaf "10"] 

しかしadd Empty (x:xs) (a:b:bs)は、3番目の引数はTWを持っていることを期待ので、それは、任意のパターンと一致しません:以下の引数を持ちますo Tree要素とリスト。したがって、3つ目の引数と1つの要素のリストが一致するパターンが必要です。

add Empty (x:xs) [a] = add Empty xs (Leaf x:[a]) 

修正エラーをして、次の印刷します:たとえば、追加あなたはすでにそれを解決していない限り

Node (Leaf "10") "+" (Leaf "1") 

が、それはあなたが仕事を継続するのに役立ちます願っています:)

+0

ありがとうございます。あなたの答えはたくさん助けてくれました:] – Mafi

関連する問題