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

Я новичок в Haskell, и я не совсем понимаю эту ошибку, когда я загружаю файловые объятия, выводит следующее «Синтаксическая ошибка в объявлении (неожиданный `;', возможно, из-за плохой компоновки)» в строке «проверить 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 && y==s2 = true  
     | s1==x && y==s2 = (check y s2 database)  
     | otherwise false

person Spoons    schedule 16.04.2011    source источник


Ответы (2)


На самом деле есть; в преобразованном исходном коде. Отчет Haskell содержит подробное объяснение того, как исходный код преобразуется с помощью правил компоновки. Их нужно прочитать один раз, это достаточно интуитивно понятно.

Хотя такие ошибки действительно сбивают с толку новичка, применяются следующие практические правила:

  • Если компилятор жалуется на ';' у вас есть синтаксическая ошибка в последней непустой строке перед строкой, о которой сообщается.
  • Чаще всего ошибка возникает из-за компоновки (как и предполагал компилятор). Тем не менее, как показывает ваш пример, есть и другие случаи: компилятор отчаянно ищет «=» во второй защите функции owns, и когда он находит точку с запятой непосредственно перед check, он знает, что что-то не так.
person Ingo    schedule 16.04.2011
comment
Спасибо за ваше объяснение, мне пришлось изменить некоторые части моего кода, но теперь он отлично работает, спасибо. - person Spoons; 16.04.2011

Вам не хватает = в ветвях 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 && y==s2 = true  
     | s1==x && y==s2 = (check y s2 database)  
     | otherwise = false
person fuz    schedule 16.04.2011