„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?