Противоречивые определения в сопоставлении с образцом - PullRequest
1 голос
/ 23 октября 2010

Я только начал изучать Haskell и столкнулся с проблемой в классах с 2 адическими типами. Вот важный код:

data Rectangle = NoRect | Rect (Float,Float) (Float,Float) | Pane
      deriving (Show)
class Collision s1 s2 where
      collides ::  s1 -> s2 -> Bool

instance (Collision Rectangle Rectangle) where
    collides (Rect (aOrX, aOrY) (aCorX, aCorY)) 
             (Rect (bOrX,bOrY) (bCorX,bCorY)) = ...
    collides Pane _ = True
    ...

Компилятор (GHC 6.12.1) теперь жалуется на Conflicting definitions for 'collides'

Не понимаю, как определения могут противоречить?

Спасибо!

1 Ответ

3 голосов
/ 24 октября 2010

Наиболее вероятный виновник - ошибка компоновки где-то в вашем "...", которая приводит к тому, что две строки collides разделяются на два отдельных блока.Conflicting definitions for 'collides' означает, что есть два разных места в одной и той же области видимости, которые определяют collides.Каким-то образом либо эти две строки прерываются, поэтому компилятор видит их как отдельные, либо есть ошибка в части «...», которая как-то определяет collides дважды в одной области видимости.

Есть 2 основных способаотключить ошибку Conflicting definitions.Во-первых, две привязки в одном и том же определении функции могут пытаться связать одну и ту же переменную, как в foo x x = ....Это недопустимо, потому что оно определяет x дважды.

Другой (который, я подозреваю, применяется в вашем коде) - это когда две части одного и того же определения «прерываются» другим определением.Компилятор видит это как два отдельных определения.Например:

foo True = ...
bar = ...
foo False = ...

Это также недопустимо, поскольку оно (снова) определяет одно и то же имя (foo) дважды.

Прерывание может быть неочевидным, особенно в случаяхгде вы случайно смешиваете табуляции и пробелы (и ваш редактор использует что-то кроме 8 табуляций на пробел, что предполагает Haskell).В вашем редакторе это может выглядеть как строка с отступом в предложении where, но из-за различий в ширине табуляции компилятор видит его выровненным по foo, что делает второе foo другим определением, конфликтующим с первым.

Обычно в языках, чувствительных к макету, считается хорошей идеей использовать только пробелы в вашем коде или, по крайней мере, убедиться, что ваш редактор использует правильное количество пробелов для своих вкладок.Для Хаскеля это 8.

...