Consider the code below :
{-# LANGUAGE
MultiParamTypeClasses,FlexibleInstances,FunctionalDependencies,UndecidableInstances,FlexibleContexts
#-}
class Foo a c | a - c
instance Foo Int Float
f :: (Foo Int a) = Int - a
f = undefined
Now when I see the inferred type of f in ghci
:t f
f :: Int -
I don't know if this is a bug or not, but the translation to type
families works:
class Foo a where
type FooT a :: *
instance Foo Int where
type FooT Int = Float
f :: Int - FooT Int
f = undefined
g :: Int - Float
g = undefined
h :: Int - FooT Int
h = g
You don't even need the class