【问题标题】:Why are patterns overlapping in this example?为什么在这个例子中模式重叠?
【发布时间】: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)) = ... 也应该更低。

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

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

【问题讨论】:

标签: haskell


【解决方案1】:
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 = 

完全匹配一切。它应该是最后一个。

【讨论】:

    【解决方案2】:

    你有:

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

    在此之后的任何子句都必须具有重叠模式。顺便提一下,那些是编译器提到的。

    【讨论】:

      猜你喜欢
      • 2013-08-19
      • 2014-11-23
      • 2013-06-13
      • 2015-04-16
      • 1970-01-01
      • 2015-06-30
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多