let rec catmap (k : α -> β list) (xs : α list) : β list =
match xs with
| [] -> []
- | x' :: xs' -> List.append (k x') (catmap f xs')
+ | x' :: xs' -> List.append (k x') (catmap k xs')
Now we can have as many elements in the result for a given `α` as `k` cares to return. Another way to write `catmap k xs` is as (Haskell) `concat (map k xs)` or (OCaml) `List.flatten (List.map k xs)`. And this is just the definition of `mbind` or `>>=` for the List Monad. The definition of `mcomp` or `<=<`, that we gave above, differs only in that it's the way to compose two functions `j` and `k`, that you'd want to `catmap`, rather than the way to `catmap` one of those functions over a value that's already a list.