#haskell
#haskell
Вопрос:
Из этого кода, предназначенного для преобразования сбалансированного троичного представления в Haskell Integer
:
frombal3 :: String -> Integer
frombal3 " " = 1
frombal3 "0" = 0
frombal3 "-" = -1
frombal3 current:therest =
(*) frombal3 current (^) 3 length therest
frombal3 therest
Я получил ошибку:
main.hs:7:3: error: parse error on input ‘ ’
|
7 | frombal3 therest
| ^
<interactive>:3:1: error:
• Variable not in scope: main
• Perhaps you meant ‘min’ (imported from Prelude)
Комментарии:
1. Не используйте обратную косую черту для продолжения строки. Haskell просто требует отступа.
2. Побочный вопрос: Почему вы используете префиксные операторы? Я бы подумал, что проще всего использовать операторы между числами, поскольку они должны использоваться. Кроме того, ваша программа выдает несколько ошибок типа, когда вы исправляете ошибки синтаксического анализа; они, вероятно, исчезнут, когда вы избавитесь от префиксных операторов (или, по крайней мере, заключите их в скобки).
Ответ №1:
Неясно, чего вы пытаетесь достичь, но я вижу некоторые ошибки, на которые уже можно указать.
Проблемы
Вам не нужно
продолжать строку, это необходимо только внутри строк. В Haskell достаточно отступов
Вам нужно заключить ваше соответствие шаблону в круглые скобки: (current:therest)
. Кроме того, этот шаблон создаст current
символ, а не строку, поэтому вы не можете напрямую передать его своей функции, которая принимает строку.
Вам также нужно обернуть аргументы вашей функции: если вы хотите умножить frombal3 current
на 3, вам нужно (*) (frombal3 current) 3
или гораздо лучше frombal3 current * 3
. Инфиксные функции имеют более высокий приоритет и делают код более понятным.
Предложения
Я не уверен, чего вы хотите достичь, но это похоже на то, что можно сделать с помощью fold
или простого понимания списка
Ответ №2:
Не используйте обратную косую черту и не забывайте правильно заключать совпадения с шаблоном в квадратные скобки:
frombal3 :: String -> Integer
frombal3 " " = 1
frombal3 "0" = 0
frombal3 "-" = -1
frombal3 (current:therest) = -- ^ Note brackets
(*) frombal3 current (^) 3 length therest
frombal3 therest
Это все еще вызывает проблему из-за того, как вы используете операторы, но я думаю, вы можете решить это самостоятельно, тем более, что я не могу понять, что вы пытаетесь здесь сделать.
Ответ №3:
Похоже, вы пытаетесь использовать обратную косую черту для перехода к следующей строке; не делайте этого. Если вы просто удалите все обратные косые черты, ошибка исчезнет. (Вы получите несколько других ошибок, но эта конкретная исчезнет.)
Haskell использует отступ, чтобы определить, где заканчивается одна часть и начинается следующая. Вам не нужно вручную добавлять обратную косую черту в конец каждой строки, чтобы продолжить выражение.