コマンドライン引数とgetArgsの謎

DF計算は一服して、前回頂いたコメントについて。

by nさん

main = putStrLn . unwords =<< getArgs

これは、引数をそれぞれ出力する、という機能を実現しますが、よくわかってない私は、「なるほど、そんなもんか」と思っただけでした。
でも、よく見るとこれだけでもいくつかのことが見えてきます。

まず、「=<<」について。この本モナドのところに出てきた記号だと思ってましたが、そうではないようです。
ちょっと調べたら、こういうことだそうです。

逆方向束縛関数 (=<<)

プレリュードでは標準の束縛関数とは逆順の引数をとる束縛関数が定義されています。標準の束縛関数は ">>=" ですので、逆束縛関数は "=<<" です。束縛演算子が高階項として使われる場合で、引数を逆順でもつのが便利な場合があり、その場合に有用です。定義は単純です。

(=<<) :: Monad m => (a -> m b) -> m a -> m b
f =<< x = x >>= f

Haskell におけるモナドのサポート

つまりこれは、fにxを束縛する、ということを言っている、、のでしょう。
上記の引数の例では、fがgetArgsで、xがputStrLn . unwordsなので、このmain関数は、getArgsにputStrLn . unwordsを束縛する、ということを表している、、のでしょう。
getArgsの動きが、まだよくわかりませんが、おそらく内部で引数とその適用関数をうまいこと結び付けてくれる(おそらく関数を引数文字列に適用)と思われますので、これで引数が表示される、ということになるようです。

さて、もう1つ気づいたのは、引数文字列にunwords関数を適用していることです。

unwords :: [String] -> String
unwords is an inverse operation to words. It joins words with separating spaces.

http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v%3Aunwords

だそうなので、スペースで分けられた文字列(word)リストを、くっつけるという役割です。
よって、getArgsで取得できる引数は、文字列リストである、ということがわかります。

リファレンスマニュアルでも、

getArgs :: IO [String]
Computation getArgs returns a list of the program's command line arguments (not including the program name).

http://haskell.org/ghc/docs/latest/html/libraries/base/System-Environment.html#v%3AgetArgs

とあります。