Любой пример перегрузки работающего оператора в haskell

Я хочу перегрузить любого оператора. я хочу сделать такую ​​простую функцию, которая, например, подумать о перегрузке оператора ==.Overload == так, что x == y
возвращает х. Или x == y вернуть x+y. Неважно, что. Можете ли вы показать мне простой пример перегрузки операторов? Я не могу найти ни одного примера в Интернете, к сожалению.

Например, когда я называю Tree a == Tree a return 5 (он всегда возвращает 5. Я выбираю его, он не связан ни с чем) или когда я вызываю 3==4 return: 7

Я попробовал приведенные ниже коды (я нахожу его из haskell.org), но он не может скомпилировать.

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

instance Eq Integer where
x == y = 5

instance Eq Float where
x == y = 5

Ни один из приведенных ниже кодов не работает:

Дерево данных a = Узел a | пустой

Класс Tree a where (==):: Tree a -> Tree a -> Int

Экземпляр Tree Integer, где x == y = 1

Я принимаю ошибку:

Ambiguous occurrence `Eq'
It could refer to either `Main.Eq', defined at Operations.hs:4:7
                      or `Prelude.Eq',
                         imported from `Prelude' at Operations.hs:1:1
                         (and originally defined in `GHC.Classes')

3 ответа

Решение

Вы не можете скрыть экземпляры из импортированного модуля. См. Например: явно импортировать экземпляры

Похоже, что "перегрузка", которую вы пытаетесь сделать, это позволить (==) для других типов, таких как деревья. Это просто! Просто создайте новый экземпляр:

data Tree a = Leaf a | Branch [Tree a]

 instance (Eq a) => Eq (Tree a) where
    (Leaf a)   == (Leaf b)   = a == b
    (Branch a) == (Branch b) = a == b
    _          == _          = False

(Вы также можете просто derive Eq пример)

Попробуйте скрыть == из прелюдии первым. Вам нужен только класс типов, если вы хотите, чтобы он работал по-разному для разных типов.

import Prelude hiding ((==))

x == y = x

Вот оператор +++, который действует как оператор (++), используемый для добавления списков:

(+++) :: [a]->[a]->[a]
x +++ [] = x
[] +++ x = x
x  +++ y = (init x) +++ ((last x) : y)
Другие вопросы по тегам