2014-10-30 60 views
1

我想知道是否有人可以幫助我確定haskell代碼中非詳盡的部分?我看不出列表末尾沒有遇到基本情況。Haskell非耗盡

非常感謝

強尼

type Rule 
    = (Char, String) 

type Rules 
    = [Rule] 

type System 
    = (Float, String, Rules) 

cross, triangle, arrowHead, peanoGosper, 
    dragon, snowflake, tree, bush :: System 

type Vertex 
    = (Float, Float) 

type TurtleState 
    = (Vertex, Float) 

type Stack 
    = [TurtleState] 

type ColouredLine 
    = (Vertex, Vertex, Colour) 


trace :: String -> Float -> Colour -> [ColouredLine] 

trace rules angle colour = traceState rules ((0,0),90) [] 

    where 

    traceState :: String -> TurtleState -> Stack -> [ColouredLine] 
    traceState [] _ _ = [] 
    traceState (x:xs) t (y:ys) 
     |x == '[' = traceState xs t (t : (y:ys)) 
     |x == ']' = traceState xs t ys 
     |x == 'F' = biggieSmalls : traceState xs t (nextY:ys) 
     |otherwise = traceState xs angledY (angledY:ys) 
     where 
      biggieSmalls = (fst(t),fst(nextY),colour) 
      nextY = move 'F' t angle 
      angledY = move x t angle 
+3

您還沒有匹配'traceState [_] _ []'。如果您編譯時出現警告,GHC應舉出一個無與倫比的模式。 – 2014-10-30 18:40:39

+1

將'-Wall'傳遞給ghc或ghci以啓用警告。 – chi 2014-10-30 19:34:47

+0

非常感謝幫助傢伙!我怎樣才能解決這個問題?我已經開啓了警告(感謝Chi!)並試圖修復不匹配的模式(感謝Benjamin!)。我仍然在努力應付那些讓它變得正確的東西! – FoxGlove 2014-10-30 20:23:32

回答

1

正如本雅明霍奇森指出,你有沒有匹配在rules串非空((_ : _)而不是[])的情況下,但Stack是空。那種情況會立即出現,因爲初始堆棧trace傳遞給traceState實際上是[]

要修復警告/異常,您需要重寫traceState的第二個公式traceState (x : xs) t y或編寫第三個公式tracestate (x : xs) t []。使用前一種解決方案,您可以使用case y ofy上進行模式匹配。無論哪種方式,您都需要確定如何處理列表爲空的情況。

問題實際上會出現在撥打電話如traceState "]" t [],即如果trace的第一個參數以「]」或「F」開頭。看起來這將是一個無效的輸入。如果是這種情況,則可能需要重寫tracetraceState以返回Maybe [ColouredLine],或使用Either給出錯誤消息。