2016-05-13 10 views
0
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.

+4

Bitte fügen Sie den Code ein, der diese Warnung erzeugt. –

+1

Dort gibt es keine Überlappungen, AFAICS. Sonderbare Warnmeldung. Veröffentlichen Sie die Muster im tatsächlichen Code. – chi

+0

Zusätzliche Informationen hinzugefügt. –

Antwort

3
eval env (List (function : args)) = do 

Die obigen Überlappungen mit nachfolgenden Mustern, z.

eval env (List (Atom "define" : List (Atom var : params) : body)) = 

seit function kann Atom "define" sein und argsList (Atom var : params) : body sein kann.

Darüber hinaus wird das Muster

eval env badForm = 

mit allem, was Matches überhaupt. Es sollte der allerletzte sein.

3

Sie haben:

eval env badForm = throwError $ BadSpecialForm "Unrecognized special form" badForm 

Jede Klausel, die durch die Notwendigkeit nach diesem muss eine überlappende Muster kommt. Das sind übrigens diejenigen, die der Compiler erwähnt.

Verwandte Themen