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.
It looks pretty normal to me as a professional Haskeller, though I suppose it’s perhaps slightly cleaner to write it as conditionalBaptizep= 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.
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 ()
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 ofid
.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.This is probably an ok use for a GADT. Something like:
Thank you for refactoring baptism. How do we push this to production now?