gpt4 book ai didi

Haskell:修复函数中的非详尽模式

转载 作者:行者123 更新时间:2023-12-01 11:42:43 25 4
gpt4 key购买 nike

我有一个程序,它遍历 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 找到。万一有帮助。

提前致谢!

最佳答案

好吧,当你看到 definition of Exp ,你可以看到有一大堆可能的构造函数。但是在您的功能中,您只检查其中两个。

那么如果我调用 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)定义来评估该表达式。

关于Haskell:修复函数中的非详尽模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18000552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com