2013-08-01 6 views
3

에 비 exuastive 패턴을 수정합니다. 여기있다 :하스켈 : 내가 AST를 통과하고 발생 기능과 사용 변수와 횟수의지도를 반환하는 프로그램이 기능

fromList *** Exception: parsemap.hs:(22,1)-(23,25): Non-exhaustive patterns in function fromExp 
:

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))))) 

프로그램 실행, 심지어 대부분의 경우에 작동하지만, 나는 (T3 등) "괄호"내가 할 다음과 같은 오류와 함께 AST의 "바르"를 호출 할 때

나는이 문제를 해결하려면 내가 도움을 사용할 수있는 방법을하지 확신합니다. 그건 그렇고, 내가 사용하는 생성자는 http://hackage.haskell.org/packages/archive/haskell-src-exts/1.0.1/doc/html/Language-Haskell-Exts-Syntax.html#t:Exp에서 찾을 수 있습니다. 사전에

감사합니다! 당신이 definition of Exp 볼 때

+4

이 아닌 철저한 패턴에 대한 경고를 얻을'-Wall'와 프로그램을 컴파일하십시오. – jberryman

답변

5

글쎄, 당신은 가능한 생성자의 전체 더미가있다 볼 수 있습니다. 그러나 당신의 기능에서, 당신은 단지 그들 중 2 개만 검사하고 있습니다. 내가 fromExp (Lit l)을 호출하는 경우

그래서 무슨 일이? 그것은 정의되지 않았습니다. 그것은 좋지 않습니다.

fromExp :: Exp -> String 
fromExp (Var qn) = fromQName qn 
fromExp (Paren e1) = "()" 
fromExp _   = "Not defined yet" 

당신이 다른 생성자를 fromExp를 호출하는 경우이 방법이 "Not defined yet"를 반환합니다 :이 문제를 해결하는 가장 쉬운 방법은 다른 모든 가능한 생성자를 포함 하나 경우에 추가하는 것입니다.


이 특정한 경우에 평가는 다음과 같습니다

vars t3 
=> vars (InfixApp (Var (UnQual (Ident "x"))) (QVarOp (UnQual (Symbol "+"))) (Paren (InfixApp (Lit (Int 3)) (QVarOp (UnQual (Symbol "+"))) (Lit (Int 2))))) 
=> vars (Paren (InfixApp (Lit (Int 3)) (QVarOp (UnQual (Symbol "+"))) (Lit (Int 2))))) 
=> vars (InfixApp (Lit (Int 3)) (QVarOp (UnQual (Symbol "+"))) (Lit (Int 2)))) 
=> fromExp (Lit (Int 3)) 

을하고 그 표현을 평가 할 fromExp (Lit l) 정의는 존재하지 않는다.

+1

나는 그것을 작동시켰다. 당신의 도움을 주셔서 대단히 감사합니다! 이제 제안대로 생성자에 대한 정의를 추가하기 시작합니다. – user2548080