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

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

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

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

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