«идиоматическое» неравенство типа Хаскеля

(отредактировано из предыдущего вопроса, где я думал, что код ниже нет работа)

Я хочу реализовать функцию 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? Если нет, какие проблемы с этим?

Ответы на вопрос(2)

Ваш ответ на вопрос