„idiomatyczna” nierówność typu Haskella

(edytowane z poprzedniego pytania, gdzie myślałem, że poniższy kod nie działa)

Chcę zaimplementować funkcję haskell f, która ma ograniczenie, tak że jej 2 parametry nie mogą mieć tego samego typu. Użyłem następującego kodu:

{-# 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 = ()

Teraz funkcja g przyjmuje tylko a i b, jeśli mają różne typy. Czy jest to „idiomiatyczny” sposób na nierówność typu kodu w haskell? Jeśli nie, jakie są z tym problemy?

questionAnswers(2)

yourAnswerToTheQuestion