2013-11-21 6 views
1

Hy, Я определил структуру данных для натуральных чисел и хотел бы определить экземпляр Eq, чтобы узнать, равны ли два числа или нет, но я продолжаю получать сообщение: «Неоднозначное происхождение из «Eq». Он может ссылаться либо на Main.eq, либо на Prelude.eq « Не могли бы вы сказать мне, что я могу делать неправильно?define Экземпляр эквалайзера -Haskell

data Nat = Z | S Nat deriving Show 

class Eq a where 
    (==) :: a -> a -> Bool  

instance Eq Nat where 
    Z == Z = True 
    (S x) == (S y) = x == y 
    x == y = False 

Спасибо большое!

+1

Я верю, что вы не должны определить свой собственный 'Eq', так что класс' уравнение а, где (==) :: -> a -> Bool' является избыточным –

ответ

3

Прелюдия Хаскелла (аналогичная стандартной библиотеке) определяет класс Eq. Проблема, с которой вы сталкиваетесь, заключается в том, что Haskell не знает, относится ли Eq к классу, который вы определили, или к встроенному в Haskell.

Рассмотрите возможность переименования вашего класса.

Более подробную информацию о прелюдии Haskell и его формула здесь: http://hackage.haskell.org/package/base-4.6.0.1/docs/Prelude.html#t:Eq

1

Вы добавили определение класса Eq, которое отличается от этого в прелюдии, и компилятор жалуется, что он не знает, какой из них вы пытаетесь создать при написании instance Eq Nat.

Вы должны удалить из своего кода объявление class Eq a where ....

+1

Или, альтернативно, 'import Prelude hiding (Eq)', если вы действительно хотите сворачивать свои собственные (но делайте это только по образовательным причинам, без причины для этого в реальном коде). –

Смежные вопросы