desigualdad tipo Haskell 'idiomática'

(editado de la pregunta anterior donde pensé que el código a continuación no funciona)

Deseo implementar una función de haskell f que tenga una restricción tal que sus 2 parámetros no deben tener el mismo tipo. He usado el siguiente código:

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

Ahora la función g solo acepta ayb si tienen diferentes tipos. ¿Es esta la forma "idiomática" de codificar la desigualdad de tipo en haskell? Si no, ¿cuáles son los problemas con él?

Respuestas a la pregunta(2)

Su respuesta a la pregunta