Free with flipped type parameters is also a monad?
Opened this issue · 1 comments
safareli commented
//data FlipFree a i = FlipFree { flip :: Free i a }
const FlipFree = daggy.tagged('flip')
// same as `hoist`
// :: FlipFree z a ~> (a -> b) -> FlipFree z b
// FlipFree.prototype.map - TODO derive
// same as `???`
// :: FlipFree z (a -> b) -> FlipFree z a -> FlipFree z b
// FlipFree.prototype.ap - TODO derive
// ap :: (Monad m) => m (a -> b) -> m a -> m b
// ap m1 m2 = do { x1 <- m1; x2 <- m2; return (x1 x2) }
// this is same as `graft`
// :: FlipFree z a ~> (a -> FlipFree z b) -> FlipFree z b
FlipFree.prototype.chain = function(f) {
return FlipFree(this.flip.foldMap(v => f(v).flip, this.flip.constructor))
}
safareli commented
Free
is MMonad
where embed
is graft
https://hackage.haskell.org/package/mmorph-1.0.9/docs/Control-Monad-Morph.html