【发布时间】:2016-05-13 18:28:27
【问题描述】:
scheme.hs:184:1: Warning:
Pattern match(es) are overlapped
In an equation for `eval':
eval env (List (Atom "define" : List (Atom var : params) : body))
=
...
eval env
(List (Atom "define" : DottedList (Atom var : params)
varargs : body))
=
...
eval env (List (Atom "lambda" : List params : body)) = ...
eval env (List (Atom "lambda" : DottedList params varargs : body))
=
...
...
来自Write Yourself a Scheme in 48 Hours 书。我不知道 Haskell,但我知道一些函数式编程,尽管如此,我还是不明白为什么这两种模式会重叠。
有人可以向我解释上述错误吗?谢谢。
编辑:我认为上面的 sn-p 可能就足够了。
eval :: Env -> LispVal -> IOThrowsError LispVal
eval env val@(String _) = return val
eval env val@(Number _) = return val
eval env val@(Bool _) = return val
eval env (Atom id) = getVar env id
eval env (List [Atom "quote", val]) = return val
eval env (List [Atom "if", pred, conseq, alt]) =
do result <- eval env pred
case result of
Bool False -> eval env alt
otherwise -> eval env conseq
eval env (List [Atom "set!", Atom var, form]) =
eval env form >>= setVar env var
eval env (List [Atom "define", Atom var, form]) =
eval env form >>= defineVar env var
eval env (List (function : args)) = do
func <- eval env function
argVals <- mapM (eval env) args
apply func argVals
eval env badForm = throwError $ BadSpecialForm "Unrecognized special form" badForm
eval env (List (Atom "define" : List (Atom var : params) : body)) =
makeNormalFunc env params body >>= defineVar env var
eval env (List (Atom "define" : DottedList (Atom var : params) varargs : body)) =
makeVarArgs varargs env params body >>= defineVar env var
eval env (List (Atom "lambda" : List params : body)) =
makeNormalFunc env params body
eval env (List (Atom "lambda" : DottedList params varargs : body)) =
makeVarArgs varargs env params body
eval env (List (Atom "lambda" : varargs@(Atom _) : body)) =
makeVarArgs varargs env [] body
这就是pastebin 的全部内容。
Edit2:嗯,这个问题不是重复的,因为它明显不同。
但如果我错过了eval env badForm = throwError $ BadSpecialForm "Unrecognized special form" badForm 行,我真的必须离开它。 eval env (List (function : args)) = ... 也应该更低。
我只能得出结论,对于这个练习,我的沉浸程度太低了。
无论如何,我现在看到了。谢谢大家。
【问题讨论】:
-
请包含产生该警告的代码。
-
那里没有重叠,AFAICS。奇怪的警告信息。在实际代码中发布模式。
-
添加了额外的信息。
标签: haskell