Наиболее вероятный виновник - ошибка компоновки где-то в вашем "...", которая приводит к тому, что две строки 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.