Perl
runrigは、MarkDominusの優れた高次Perlの手法を提案しました。HOPの無料で入手可能なサンプルコードのStreamモジュールを使用すると、エラトステネスのふるいは
#! /usr/bin/env perl
use strict;
use warnings;
use Stream qw/ filter head node promise show tail upfrom /;
use subs 'sieve'; # no parens on recursive calls
sub sieve {
my($s) = @_;
my $n = head $s;
node $n, promise { sieve filter { $_[0] % $n != 0 } tail $s };
}
sub primes { sieve upfrom 2 }
show primes, 10;
出力:
$ ./primes
2 3 5 7 11 13 17 19 23 29
Python
alexboweによる要点からコードを借りて、ストリームを使用したPythonのふるいは
#! /usr/bin/env python
null_stream = (None, None)
def reduce(f, result, stream):
if stream is null_stream: return result
return reduce(f, f(result, head(stream)), tail(stream))
def take(N, stream):
if N <= 0 or stream is null_stream: return null_stream
return (head(stream), lambda: take(N-1, tail(stream)))
def filter(pred, stream):
if stream is null_stream: return null_stream
if pred(head(stream)):
return (head(stream), lambda: filter(pred, tail(stream)))
return filter(pred, tail(stream))
def integers_from(N): return (N, lambda: integers_from(N+1))
def head((H, _)): return H
def tail((_, T)): return T()
def to_array(stream): return reduce(lambda a, x: a + [x], [], stream)
def sieve(stream):
if stream is null_stream: return null_stream
h = head(stream)
return (h, lambda: sieve(filter(lambda x: x%h != 0, tail(stream))))
def primes(): return sieve(integers_from(2))
print to_array(take(10, primes()))
出力:
$ ./prymes
[2、3、5、7、11、13、17、19、23、29]
その他の可能性
一部の言語では、ストリームパターンは表示されません。たとえば、遅延評価はHaskellの機能であるため、次のように定義できますprimes。
primes = sieve [2 ..]
where sieve (x:xs) =
let remains = filter (not . isMultipleOf x) xs
in x : sieve remains
isMultipleOf a b = b `mod` a == 0