desigualdade de tipo 'idiomática' Haskell

(editado a partir da pergunta anterior, onde eu pensei que o código abaixo não funciona)

Desejo implementar uma função haskell f que tenha uma restrição tal que seus dois parâmetros não devam ter o mesmo tipo. Eu usei o seguinte 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 = ()

Agora a função g só aceita a e b se eles tiverem tipos diferentes. Essa é a maneira "idiomática" de codificar a desigualdade de tipos no haskell? Se não, quais são os problemas com isso?