Haskell Quiz No.13

難易度: λλ

以下のプログラムの実行結果はどうなるでしょうか?

答えは次回

はじめに

前回の問題と答えは以下の通りです。

問題

難易度: λ

以下のプログラムの実行結果はどうなるでしょうか?

こたえ

$ ./Quiz12.hs
1
2
3
4
5
6
7
8
9
10

解説

Quiz10 でよく似た問題を出題しました。

異なるのは最後の return ()sinkNull だけです。

Quiz10 の結果は何も表示されませんでしたが、今回は 1 ~ 10 の数字が表示されています。

この挙動を理解するために sinkNull の実装を確認してみましょう。

sinkNull

sinkNull 関数の実装は以下の通りです。

非常にシンプルな実装になっています。 awaitForever の実装は以下の通りです。

つまり、上流に対して値を要求し、その値に対して、引数として与えられた関数 f を適用するという関数です。 Forever という名前の通り、この関数は上流の値が無くなるまで値を要求し続けます。(そのため、yieldMany [1..] のような無限リストの場合は停止しません。)

await 関数はこのような定義だったので、とても似ていますね。

まとめ

  • sinkNull は上流で用意した値を全て処理するために使うと便利
  • await は上流の値を一度だけ要求する
  • awaitForever は上流の値が無くなるまで要求する

以上です。