«идиоматическое» неравенство типа Хаскеля
(отредактировано из предыдущего вопроса, где я думал, что код ниже не работает)
Я хочу реализовать функцию 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, если они имеют разные типы. Является ли это «идиомиатическим» способом кодирования неравенства типов в haskell? Если нет, какие проблемы с этим?