为什么这个例子中的模式重叠?

时间:2016-05-13 08:54:04

标签: haskell

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)) = ...也应该更低。

我只能得出结论,我的沉浸程度对于这项练习来说太低了。

无论如何,我现在都看到了。谢谢大家。

2 个答案:

答案 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

此后的任何条款必须具有重叠模式。顺便提一下,这是编译器提到的那些。