Почему Хаскелл жалуется на этот знак плюс?

#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 использует отступ, чтобы определить, где заканчивается одна часть и начинается следующая. Вам не нужно вручную добавлять обратную косую черту в конец каждой строки, чтобы продолжить выражение.