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

Я довольно новичок в 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

Ответы [ 2 ]

4 голосов
/ 16 апреля 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
2 голосов
/ 16 апреля 2011

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

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

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