cat

{- Haskell -}
main = do cs <- getContents
          putStr cs
  • do
    • 式を束ねる。上から順に実行。
    • オフサイドルール
      • Pythonのようにインデントが意味を持つ
  • "<-"
    • getContentsアクションの結果入力された文字列に変数を束縛する。

: getContents , putStr cs

(* OCaml *)
let rec cat () = try
  begin
    output_char stdout (input_char stdin) ;
    cat ()
  end
with
    End_of_file -> ()

let _ =  cat ()

Haskell以外の言語では I/Oモナドみたいな仕組みが無いのでループ(再帰)を使うか入力サイズを制限するかしなきゃならない。

追記

モナドらしく書くとこうなるらしい。すごいシンプル。

{- Haskell -}
main = getContents >>= putStr