Haskell Integer не действует как Integer - PullRequest
1 голос
/ 21 апреля 2019

Итак, я определяю переменную / функцию, которая принимает два входа и отображает последовательность из 1 и 0

bin 0 0 = '0'
bin 0 1 = '1'
bin 0 2 = '1'
bin 0 3 = '0'
bin 0 4 = '1'

Теперь я хочу создать дубликат переменной bin, за исключением того, что при 0 3должно быть 1, поэтому я пытался добиться этого в новой функции

changeBin w z = binNew where 
                binNew w z = '1'
                binNew x y = bin x y

, но если я делаю это так, это выдает мне избыточное предупреждение о совпадении с образцом, и когда я вызываю changeBin 0 3, он попадает в циклно когда я изменяю функцию на

changeBin w z = binNew where 
                binNew 0 3 = '1'
                binNew x y = bin x y

, это работает, но я хочу сделать это первым способом, чтобы я мог изменить его в любое время без написания всей функции, но я не знаю, почему это дает мне избыточную ошибку, когдаЯ пишу то же самое только с числами, это работает

Я новичок в Haskell, терпите меня, спасибо

Любая помощь приветствуется в том, что моя ошибка в первой функции

1 Ответ

7 голосов
/ 21 апреля 2019
1 changeBin w z = binNew where 
2                 binNew w z = '1'
3                 binNew x y = bin x y

w в строке 1 и w в строке 2 - это разные переменные.w в строке 2 не становится шаблоном, который соответствует, только когда он имеет то же значение, что и w, заданное в первой строке - вместо этого он определяет новую переменную, которая затеняет старую.Вам нужно явно сравнить:

changeBin w z = binNew
    where
    binNew w' z' 
        | w' == w && z' == z = '1'
        | otherwise = bin x y
...