This bad, albeit perfectly fine code will fail with traverse, but work just fine in haskell, that is due to lazyness. I believe this can be recreated using Eval and Option composed but that is very very ugly to do by hand, so maybe offer a short hand method?