tkykmw code

学びたいことを学ぶ

アンダースタンディング コンピュテーション 6.1.11.1 MULTIPLES_OF 別解

倍数の無限ストリームMULTIPLES_OFの別解。

MULTIPLES_OF = -> m {
  Z[-> f { -> c {
    UNSHIFT[-> x { f[INCREMENT[c]][x] }][MULTIPLY[c][m]]
  }}][ONE]
}

数列として表現するなら

multiples\_of(m) = {m, 2m, 3m, ... }

だから、この方が素直だと思う。さらに、この構造を見れば、実はMAPUPWARDS_OFを使って書けるのにもすぐ気が付く。

MULTIPLES_OF = -> m {
  MAP[UPWARDS_OF[ONE]][MULTIPLY[m]]
}

ちなみに、本に載っている実装例は、数列を次のように理解していると解釈できる。もちろん結果は全く同じだが。

multiples\_of(m)_{n+1} = m + multiples\_of(m)_{n}