wow, Haskell has thought of everything