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,但我确实知道一些函数式编程,尽管我无法弄清楚为什么这两个模式是重叠的。
有人可以向我解释上述错误吗?感谢。
编辑:我认为上面的代码段就足够了。
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)) = ...
也应该更低。
我只能得出结论,我的沉浸程度对于这项练习来说太低了。
无论如何,我现在都看到了。谢谢大家。
答案 0 :(得分:3)
eval env (List (function : args)) = do
以上与后续模式重叠,例如
eval env (List (Atom "define" : List (Atom var : params) : body)) =
因为function
可以是Atom "define"
而args
可以是List (Atom var : params) : body
。
此外,模式
eval env badForm =
完全匹配所有内容。它应该是最后一个。
答案 1 :(得分:3)
你有:
eval env badForm = throwError $ BadSpecialForm "Unrecognized special form" badForm
此后的任何条款必须具有重叠模式。顺便提一下,这是编译器提到的那些。