Любой пример перегрузки работающего оператора в 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)