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?