Я определил дизъюнкцию на уровне типа следующим образом:
{-# LANGUAGE DataKinds, TypeFamilies #-}
type family Or (a :: Bool) (b :: Bool) :: Bool
type instance Or False a = a
type instance Or True a = True
Теперь я хотел бы доказать (в Haskell), что он идемпотент. То есть, я хочу построить термин idemp
с типом
idemp :: a ~ b => proxy (Or a b) -> proxy a
который функционально эквивалентен id
. (Очевидно, я могу определить его, например, как unsafeCoerce
, но это обман.)
Возможно ли это?