Streamモジュールについて
>確かにストリームは遅延リストとして利用することもできるのですが、パーサが破壊的にふるまうため、 npeek などを併用したりする必要があり、かなり面倒です。
>
>具体的には、
>
># let f = parser
| [< 'c >] -> c
| [< >] -> raise Not_found;;
val f : 'a Stream.t -> 'a = <fun>
# let s = [< '1; '2; '3 >];;
val s : int Stream.t = <abstr>
# f s;;
- : int = 1
# f s;;
- : int = 2
# f s;;
- : int = 3
# f s;;
Exception: Not_found. > >といったことが起こります。こういう小さい例では問題ないのですが、ひとつのストリームをいろいろ取り回してみたり、関数を組み合わせてみたりすると、どこで何が実行されるからここで1コ要素が削られて……ということを考えだしてしまい、そのうち疲れました。Extlib には >Enum > というストリームによく似た(そしてそこそこ便利な関数が揃った)モジュールがあるのですが、これも破壊的なふるまいを示すので同じようにうんざりとしました。 > >ついカッとなって LazyList を作ってみたのにはそういう背景があります。 >
| [< 'c >] -> c
| [< >] -> raise Not_found;;
val f : 'a Stream.t -> 'a = <fun>
# let s = [< '1; '2; '3 >];;
val s : int Stream.t = <abstr>
# f s;;
- : int = 1
# f s;;
- : int = 2
# f s;;
- : int = 3
# f s;;
Exception: Not_found. > >といったことが起こります。こういう小さい例では問題ないのですが、ひとつのストリームをいろいろ取り回してみたり、関数を組み合わせてみたりすると、どこで何が実行されるからここで1コ要素が削られて……ということを考えだしてしまい、そのうち疲れました。Extlib には >Enum > というストリームによく似た(そしてそこそこ便利な関数が揃った)モジュールがあるのですが、これも破壊的なふるまいを示すので同じようにうんざりとしました。 > >ついカッとなって LazyList を作ってみたのにはそういう背景があります。 >
