@EricRogstad - As far as I know the puzzle doesn't have anything to do with initial F-algebras. I think the type for a list algebra should just be `[a] -> a`. There's no need to take any fixedpoints.

Let me keep going with (c). In order to show the two operations are inverses, we need to show:

1. `alg = foldr (\x y -> alg [x,y]) (alg [])` (ie, turning an list algebra into a monoid and converting it back gets us the original list algebra)

2. Two parts:

a. `(<>) = \ x y -> foldr (<>) mempty [x,y]`

b. `mempty = foldr (<>) mempty []`

So (1) is annoying but (2) is super easy.

2a. Showing `(<>) = \x y -> foldr (<>) mempty [x,y]` is the same as showing `x <> y = foldr (<>) mempty [x,y]`. But we have:

foldr (<>) mempty [x,y]
= x <> y <> mempty
= x <> y

2b. In one step of evaluation we have `foldr (<>) mempty [] = mempty`, so we're done.

Showing (1) requires more work, and we may need to lean on associativity/unitality...