Ошибка отношений Haskell — синтаксическая ошибка в объявлении (неожиданная `;’, возможно, из-за плохой компоновки)

#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. Спасибо за ваше объяснение, мне пришлось изменить некоторые части моего кода, но теперь он работает отлично, спасибо.