3

AST をトラバースし、使用された関数と変数のマップとそれらが何回発生したかを返すプログラムがあります。ここにあります:

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

ほとんどの場合、プログラムは実行され、動作しますが、「Paren」(t3 など) を使用して AST で「vars」を呼び出すと、次のエラーが発生します。

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 。

前もって感謝します!

4

1 に答える 1