#haskell #syntax-error
#haskell #синтаксическая ошибка
Вопрос:
Я довольно новичок в Haskell и не до конца понимаю эту ошибку, когда я загружаю файл, hugs выводит следующее «Синтаксическая ошибка в объявлении (неожиданное `;’, возможно, из-за плохой компоновки)» в строке «проверьте s1 s2 ((x, y):xs)». Я нахожу это запутанным, поскольку в коде нет «;». Если бы кто-нибудь мог объяснить, почему это происходит и как я могу это исправить, я был бы очень благодарен. Ниже приведен мой код.
type Owned = String
type Owner = String
type Fact = (Owned,Owner)
database = [(String, String)]
database = [("c4","c5"),("c1","c2"), ("c2", "c3"), ("c3","c4")]
owns :: Owner -> Owned -> Bool
owns s1 s2
| check s1 s2 database = true
| otherwise false
check s1 s2 ((x,y):xs)
| s1==x amp;amp; y==s2 = true
| s1==x amp;amp; y==s2 = (check y s2 database)
| otherwise false
Ответ №1:
Вам не хватает =
в otherwise
ветвях:
type Owned = String
type Owner = String
type Fact = (Owned,Owner)
database = [(String, String)]
database = [("c4","c5"),("c1","c2"), ("c2", "c3"), ("c3","c4")]
owns :: Owner -> Owned -> Bool
owns s1 s2
| check s1 s2 database = true
| otherwise = false
check s1 s2 ((x,y):xs)
| s1==x amp;amp; y==s2 = true
| s1==x amp;amp; y==s2 = (check y s2 database)
| otherwise = false
Ответ №2:
На самом деле, в преобразованном исходном коде есть ;. Отчет Haskell содержит подробное объяснение того, как исходный код преобразуется с помощью правил компоновки. Их нужно прочитать один раз, это довольно интуитивно понятно.
Хотя такие ошибки действительно сбивают с толку новичка, применяются следующие эмпирические правила:
- Если компилятор жалуется на ‘;’, у вас синтаксическая ошибка в последней непустой строке, перед сообщаемой строкой.
- Чаще всего ошибка возникает из-за компоновки (как, собственно, и предполагал компилятор). Тем не менее, есть и другие случаи, как показывает ваш пример: компилятор отчаянно ищет ‘=’ во втором защитном элементе функции
owns
и когда он находит точку с запятой непосредственно передcheck
, он знает, что что-то не так.
Комментарии:
1. Спасибо за ваше объяснение, мне пришлось изменить некоторые части моего кода, но теперь он работает отлично, спасибо.