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))
=
...
...
Aus dem Write Yourself a Scheme in 48 Hours Buch. Ich weiß nicht, Haskell, aber ich kenne einige funktionale Programmierung und trotzdem kann ich nicht herausfinden, warum diese beiden Muster sich überschneiden.Warum überlappen sich Muster in diesem Beispiel?
Kann mir jemand den obigen Fehler erklären? Vielen Dank.
Edit: Ich dachte, das obige Snippet könnte genug sein.
eval :: Env -> LispVal -> IOThrowsError LispVal
eval env [email protected](String _) = return val
eval env [email protected](Number _) = return val
eval env [email protected](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" : [email protected](Atom _) : body)) =
makeVarArgs varargs env [] body
Hier ist das Ganze in dieser pastebin.
Edit2: Nun, die Frage ist kein Duplikat, weil es deutlich anders ist.
Aber für mich, die Linie eval env badForm = throwError $ BadSpecialForm "Unrecognized special form" badForm
zu verpassen, muss ich wirklich raus sein. Die eval env (List (function : args)) = ...
sollte auch niedriger sein.
Ich kann nur schließen, dass mein Niveau der Immersion für diese Übung viel zu niedrig ist.
Jedenfalls sehe ich es jetzt. Danke an alle.
Bitte fügen Sie den Code ein, der diese Warnung erzeugt. –
Dort gibt es keine Überlappungen, AFAICS. Sonderbare Warnmeldung. Veröffentlichen Sie die Muster im tatsächlichen Code. – chi
Zusätzliche Informationen hinzugefügt. –