我有一個程序遍歷AST並返回使用的函數和變量的映射以及它們發生的次數。那就是:Haskell:修復函數中的非泛泛模式
import Data.Map
import Language.Haskell.Exts.Syntax
increment :: Ord a => a -> Map a Int -> Map a Int
increment a = insertWith (+) a 1
fromName :: Name -> String
fromName (Ident s) = s
fromName (Symbol st) = st
fromQName :: QName -> String
fromQName (Qual _ fn) = fromName fn
fromQName (UnQual n) = fromName n
fromLiteral :: Literal -> String
fromLiteral (Int int) = show int
fromQOp :: QOp -> Map String Int
fromQOp (QVarOp qn) = increment (fromQName qn) empty
fromExp :: Exp -> String
fromExp (Var qn) = fromQName qn
fromExp (Paren e1) = "()"
vars :: Exp -> Map String Int
vars (Var qn) = increment (fromQName qn) empty
vars (Lit l) = increment (fromLiteral l) empty
vars (Paren e1) = increment "()" (vars e1)
vars (InfixApp exp1 qop exp2) = increment (fromExp exp1) $ unionWith (+) (fromQOp qop) (vars exp2)
t3 = (InfixApp (Var (UnQual (Ident "x"))) (QVarOp (UnQual (Symbol "+"))) (Paren (InfixApp (Lit (Int 3)) (QVarOp (UnQual (Symbol "+"))) (Lit (Int 2)))))
的程序運行,甚至在大多數情況下工作,但是當我打電話「瓦爾」上的AST與「括號」(如T3),我收到以下錯誤:
fromList *** Exception: parsemap.hs:(22,1)-(23,25): Non-exhaustive patterns in function fromExp
我不知道如何解決這個問題,我可以使用一些幫助。順便說一句,我使用的構造函數可以在http://hackage.haskell.org/packages/archive/haskell-src-exts/1.0.1/doc/html/Language-Haskell-Exts-Syntax.html#t:Exp找到,以防有所幫助。
在此先感謝!
嘗試使用'-Wall'編譯您的程序以獲取非窮舉模式的警告。 – jberryman