• 0 Posts
  • 2 Comments
Joined 2 years ago
cake
Cake day: June 22nd, 2023

help-circle

  • This is probably an ok use for a GADT. Something like:

    {-# LANGUAGE DataKinds      #-}
    {-# LANGUAGE GADTs          #-}
    {-# LANGUAGE KindSignatures #-}
    
    data Bap = Baptized | Unbaptized
    
    data Person :: Bap -> * where
       Baptize :: Person Unbaptized -> Person Baptized
       NewPerson :: Person Unbaptized
    
    conditionalBaptize :: Person a -> Person Baptized
    conditionalBaptize p =
        case p of NewPerson -> Baptize p
                  Baptize _ -> p
    
    main = return ()