«идиоматическое» неравенство типа Хаскеля
(отредактировано из предыдущего вопроса, где я думал, что код ниже нет работа)
Я хочу реализовать функцию haskell f, которая имеет ограничение, так что ее 2 параметра не должны иметь одинаковый тип. Я использовал следующий код:
{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, UndecidableInstances, FlexibleInstances, FlexibleContexts, TypeFamilies, IncoherentInstances #-}
data HTrue = HTrue
data HFalse = HFalse
class HEq x y b | x y -> b
instance (b ~ HTrue) => HEq x x b
instance (b ~ HFalse) => HEq x y b
g :: (HEq a b HFalse) => a -> b -> ()
g x y = ()
Теперь функция g принимает только a и b, если они имеют разные типы. Этоidiomiatic» способ кодирования типа неравенства в Haskell? Если нет, какие проблемы с этим?