случай избыточного сопоставления с образцом - PullRequest
0 голосов
/ 18 марта 2019

Я пытаюсь написать интерпретатор языка haskell для различных операторов.Одним из таких является заявление переключения.Я сделал следующее на данный момент, но я застрял, и я продолжаю получать избыточное предупреждение о соответствии шаблону для строки (_ -> if length) в выражении case.Он проходит тест, если первое выражение случая является правильным, но если нет, то тест не проходит.Спасибо за помощь, спасибо

 interpret :: Program -> Memory -> Either Err Memory
 interpret [] memory = Right memory
 interpret (SwitchStmt var c:p) memory = let case1 = fst(c!!0)
                                            case2 = snd(c!!0)
                                         in do
                                           val <- evaluate var memory
                                           case val of case1 -> (interpret (case2++p) memory)
                                                        _ -> if length c > 1 then interpret ((SwitchStmt var (tail c)):p) memory
                                                             else interpret p memory 

Я определил типы данных как таковые:

data Stmt = SwitchStmt{
                        switchVar  :: Expr,
                        switchCase :: [(Expr,[Stmt])]
                        } 

1 Ответ

5 голосов
/ 18 марта 2019
case val of case1

не делает то, что вы думаете, а именно проверяет, равен ли val case1.Он вводит новую привязку с именем case1, скрывая существующую привязку, значение которой равно val.Вы не получаете сравнения на равенство бесплатно: вы должны запросить их, используя ==, возможно, в предложении guard или в выражении if.Итак, у вас есть два избыточных шаблона: предложение _ никогда не будет введено, потому что шаблон case1 соответствует всем возможным входам.

Вместо этого напишите тест на равенство самостоятельно.Есть более хорошие способы сделать это, но способ сделать это, внося минимальные изменения в вашу существующую функцию, может быть:

... do
  val <- evaluate var memory
  if val == case1
    then interpret ...
    else interpret ...
...