GHC拡張RecursiveDoが何か知りたく、https://ocharles.org.uk/blog/posts/2014-12-09-recursive-do.html この記事を読んだ。
RecursiveDoに到達する以前に単に遅延評価に衝撃を受けたのでシェアさせていただきます。
repmin problem
というもの。
何らかのtraversableなもの、例えば次のような木構造を、
Tree 4 [Tree 6 [], Tree 2 []]
木構造内の一番小さい値をつかって更新したい、
Tree 2 [Tree 2 [], Tree 2 []]
という問題。 (例えば各値を全体の割合にしたいとか)
これ普通に考えると、2回走査が必要。
しかし、「更新後のTreeと、最小の値を返す関数」を作ったとして、
let (tree', minimum) = f tree minimum
ということができてしまう。
という話題でした。
右辺に左辺で定義されるminimum
が出てきて、「なにこれ」となったが、遅延評価の言語なので、thunkとして扱うことができる。
(RecursiveDoは、例での評価したい値の取得にIOがある場合は?と言うものらしい)
言語の特性によって新たな物の考え方を得ることがたまにある。そのような時はとても楽しい。