Haskell で開発されたアプリケーションのソースで、こういう形のものがある。

---[ Main.hs ]---
module Main where
import Application (runApp)

main :: IO ()
main = runApp

---[ Application.hs ]---
module Application (runApp) where

runApp :: IO ()
runApp = do
 ほりゃらら

つまり、Main モジュールにはできるだけ何も書かず、別のモジュールに仕事を移譲している。
中には runApp 関数を一つ持つ Application クラスと、そのインスタンス型が一つだけ定義されている事もある。

このような実装の runApp 関数が実際に担っているロールはどれもアプリのエントリポイントだ。
しかし、これはまさに main 関数のロールではないだろうか。
main 関数が本来担う仕事を他の関数に丸投げする事にどのような意味やメリットがあるのだろうか。