2017-05-03 28 views
1

我在我的case語句中遇到了(我假設)我正在使用的類型(用於huffman編碼的任務)的類型。我想從樹頂部到每個葉子,並返回一個鍵值對列表。 []傳遞正常,但[h]返回一個解析錯誤,我不知道爲什麼。Haskell:case語句中的解析錯誤(涉及列表!)

type HCode = [Bit] 
data Bit = L | R deriving (Eq, Show) 
data Tree a = Leaf Int a | Node Int (Tree a) (Tree a) deriving (Eq) 

convert :: Ord a => HCode -> Tree a -> [(a,HCode)] 
convert hs tree = 
    case hs tree of 
    []  (Node _ a b) -> (convert [L]   a)++(convert [R]   b) 
    [h] (Node _ a b) -> (convert !([h]++[L]) a)++(convert !([h]++[R]) b) 
    (h:hs) (Node _ a b) -> (convert !((h:hs)++[L]) a)++(convert !((h:hs)++[R]) b) 
    [h] (Leaf _ a) -> [(a, [h])] 
    (h:hs) (Leaf _ a) -> [(a, (h:hs))] 

此外,我以前沒有使用過劉海,但我認爲他們在這裏適合?他們會對性能產生影響嗎?我是否在正確的環境中使用它們?

+0

我建議你詢問有關爆炸圖案一個單獨的問題。一個問題 - 每個stackoverflow問題是最好的。總之:不,你沒有正確使用它們。 –

+0

在這裏,劉海對我來說沒有什麼意義,但我可能是錯的。無論哪種方式,我認爲這是一個單獨的問題,而不是你遇到的模式匹配問題。 – amalloy

+0

@ ThomasM.DuBuisson是啊,只是一個小問題,一個是或否是我一直在尋找,所以謝謝 – 420fedoras

回答

3

case a b of ...不匹配對陣雙方ab,但調用a的功能,用參數b的結果相當一致。一個case表達式總是與一個值匹配,甚至第一個子句(你認爲正在工作)絕對不起作用。

來匹配兩個值,你包起來的元組,然後掰開元組的每個子句中,像這樣:

case (hs, tree) of 
    ([], (Node _ a b)) -> ... 
    ([h], (Node _ a b)) -> ... 
    ... 
+0

我明白了,這很有道理。在這種情況下,爲什麼編譯器不會給我第一行的解析錯誤? – 420fedoras

+1

@ 420fedoras我認爲這是一個階段的事情。通過在ghci中播放一點,似乎'[] x' * *作爲模式解析(同樣是'Just x'),因爲'[]'被認爲是一個構造函數。然後,在類型檢查過程中,它抱怨說'[]'有太多爭論。 – luqui