you are viewing a single comment's thread
view the rest of the comments
[–] 14 points 1 year ago* (last edited 1 year ago) (4 children)

That honestly seems like the best way to write conditionalBaptize but I still hate it. Probably because IRL you'd just rewrite baptism instead of retrofitting the function with a clever use of id.

  • source
  • hideshow 4 child comments
  • [–] 11 points 1 year ago* (last edited 1 year ago) (2 children)

    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 ()
    
  • source
  • parent
  • hideshow 2 child comments
  • [–] 5 points 1 year ago* (last edited 1 year ago)

    It looks pretty normal to me as a professional Haskeller, though I suppose it's perhaps slightly cleaner to write it as conditionalBaptize p = fromMaybe p $ baptize p. It's largely just a matter of taste and I'd accept either version when reviewing an MR.

    Edit: I just thought of another version that actually is far too clever and shouldn't be used:

    conditionalBaptize = ap fromMaybe baptize, making use of the monad instance for ->. But yeah, don't do this.

  • source
  • parent