Домашнее задание с ошибкой Haskell

Я уже давно ищу ошибку. Haskell жалуется на «ошибку синтаксического анализа (возможно, неправильный отступ или несоответствие скобок)». Я ничего не мог найти. Есть ли кто-нибудь, кто может мне помочь? Код должен складывать и вычитать двоичные числа.

binadd :: [Int] -> [Int] -> [Int]
binadd xs ys = revers (binadd'(reverse xs) (reverse ys) 0) 
                       where binadd' [] [] _         = []
                             binadd' (x:xs) (y:ys) u = (mod (x+y+u) : binadd' xs ys) (div(x+y+z)2)
                             binadd' _ _ _           = error "Listen verschieden lang"


binsub :: [Int] -> [Int] -> [Int]
binsub a b = binadd a (help b) 
                 where help list = binadd [000000001] ([kipp i | i <- list ])
                       kipp    1 = 0
                       kipp    0 = 1

person SR23    schedule 24.07.2014    source источник
comment
Вы знаете, что [000000001] это то же самое, что и [1], верно? Кроме того, mod нужно два аргумента, но вы дали ему только (x+y+u) и ожидаете, что результатом будет число. — В любом случае... пожалуйста, добавьте к такому вопросу фактическое сообщение об ошибке!   -  person leftaroundabout    schedule 25.07.2014
comment
Похоже, вы используете вкладки для отступов. Вместо этого я бы предложил использовать пробелы, так как GHC может видеть вкладки не так, как настроен ваш редактор. Большинство редакторов поддерживают возможность вставки пробелов при нажатии клавиши табуляции. Это распространенный источник ошибок синтаксического анализа для начинающих, которые я вижу на SO по крайней мере 4 или 5 раз в неделю. Хотя можно использовать табуляцию для отступов, я гарантирую, что вы избавите себя от многих проблем, просто переключившись на пробелы.   -  person bheklilr    schedule 25.07.2014
comment
Гораздо полезнее, если вы включите точное сообщение об ошибке, как сказал leftaroundabout. Сообщение об ошибке содержит полезную информацию о том, что именно пошло не так. В нынешнем виде это немного похоже на электронное письмо своему врачу, в котором говорится, что какая-то часть меня испытывает острую боль. Пожалуйста, назначьте что-нибудь, чтобы сделать его лучше. Не включать сообщение об ошибке, когда его спрашивают, все равно, что не отвечать на вопросы врача о вашей боли.   -  person AndrewC    schedule 25.07.2014
comment
@bheklilr: это не первый отступ сломать его код.   -  person Zeta    schedule 25.07.2014
comment
Обратите внимание, что даже если кому-то удастся правильно использовать табуляцию в своем коде на Haskell, он все равно создаст беспорядок в коде, когда он вставит его в SO, потому что SO показывает его как 4 пробелы, в то время как Haskell интерпретирует его как 8.   -  person Ørjan Johansen    schedule 25.07.2014


Ответы (1)


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

Хотя, честно говоря, в коде довольно много других проблем. Во-первых, вы неправильно написали reverse как revers и использовали переменную z, которая нигде не определена (вы имеете в виду div (x+y+u) 2). Тогда вы забыли написать 2 в mod (x+y+u) 2. Кстати, Хаскеллеры обычно пишут такие функции, как div и mod, в инфиксной нотации:

                         ... = ((x+y+u)`mod`2 : binadd' xs ys) ((x+y+u)`div`2)

По какой-то причине это читается более бегло, IMO, а также не позволяет вам так легко забывать аргументы.

Строка по-прежнему неверна: у вас есть две непересекающиеся группы в скобках ((x+y+u)`mod`2 : binadd' xs ys) и ((x+y+u)`div`2). Помещение двух вложенных выражений подряд одно за другим всегда означает, что первое является функцией, а второе — аргументом этой функции. Но не в этом случае: ((x+y+u)`mod`2 : ...) может быть только списком, а не функцией. Однако binadd' xs ys по-прежнему является функцией, потому что вы снова забыли аргумент. Этот аргумент является другим родительским блоком: вы хотите binadd' xs ys ((x+y+u)`div`2). Если вы поместите голову перед этим, вы можете полностью удалить внешние скобки:

                         ... = ( (x+y+u)`mod`2 : binadd' xs ys ((x+y+u)`div`2) )
                             ≡ (x+y+u)`mod`2 : binadd' xs ys ((x+y+u)`div`2)

Вероятно, есть еще проблемы, но, пожалуйста, попробуйте найти их самостоятельно!

person leftaroundabout    schedule 24.07.2014