{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
module Try.TypeClasses.TypeClasses where
Problem
Make a function that converts a Foo to TFoo Foo and other types to TA a.
Avoid TypeApplications if possible.
data Foo = Foo
data Bar = Bar
data FooOrA a = TFoo Foo | TA a
class Convert a b where
  toFooOrA :: a -> FooOrA b
instance Convert Foo a where
  toFooOrA = TFoo
instance (a ~ b) => Convert a b where
  toFooOrA = TA
s1 :: Integer
s1 = case toFooOrA @Int 42 of
  TFoo _ -> 1
  TA _ -> 2
-- >>>s
-- 1
s2 :: Integer
s2 = case toFooOrA Bar of
  TFoo _ -> 1
  TA _ -> 2
-- >>>s2
-- 2