Почему мой шаблон совпадает внутри перекрытия блока?Почему эти совпадения совпадают?
(q, m) <- newRq
let m2 = appendMsg "first" key m
(q4, m4) = case m2 of
m -> deleteRec key q m2
_ -> (q, m2)
компилируется с предупреждением
Warning: Pattern match(es) are overlapped
In a case alternative: _ -> ...
и не работает, как я хочу. Это только кажется, что для (q4, m4) всегда возвращает
[], fromList []
пренебрегая, что значения m2 и РТО. Есть ли локальные переменные, где я их не ожидаю?
То, что я хочу достичь словами: Если m2 и m равны, то (q4, m4) следует оценить до deleteRec key q m2
, в противном случае - (q, m2).
Истина для if, но я просто сидел в течение одного часа, чтобы избежать этого, так как я всегда читал, что это не идиоматично, и что в Haskell разработчики должны использовать шаблон, где это возможно. –
Да, вы * должны * использовать образец соответствия, когда это возможно. Но это невозможно для сопоставления с * значением * переменной. Переменная в шаблоне - это просто «дыра», например '_', которая может взять что угодно; Затем он присваивает все, что было там, для этого имени. –
Есть ли еще альтернатива if-then-else? –