{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE Rank2Types #-} {-# LANGUAGE UndecidableInstances #-} module Type.Class.Partial ( Partial, PartialTag, partial ) where import Type.Class.Nullary -- | Prefer 'partial'. However, if you want to disable Partial -- wholesale, make an orphan instance of Tag for this type. -- NEVER put an instance of this in a library. data PartialTag -- | Nullary type class to mark partial functions, e.g. head. class Partial instance Tag PartialTag => Partial -- | Accept the possibility of partiality. partial :: (Partial => a) -> a partial = unsafeTag (Proxy :: Proxy PartialTag) {-# INLINE partial #-}