C++

C++のラムダ「だけ」で再帰するか

  • このエントリーをはてなブックマークに追加
  • Pocket

はじめに

これを読む前に絶対に

C++のラムダで再帰する | koturnの日記

を読んでくれ。

この記事では更に変態的なラムダの再帰を扱う。

 

ラムダ式の再帰|基礎編

koturnの日記にも書いてるので軽く。

いくつかの手法があることを述べる。

 

std::functionを用いる方法

C++11にはジェネリックラムダがないのでこれでやることが多いのかも。

 

ジェネリックラムダ+関数テンプレート

これ書くやつおるん?

 

ジェネリックラムダ+関数オブジェクト

C++14で最もスタンダードな手法だと思われる。

 

ジェネリックラムダオンリー

変態向け。

 

ジェネリックラムダ+関数オブジェクト

こういうやつ。

koturnの日記からパクってきた。

fix というのHaskellとかにもあるし、わかりやすい。

しかしだ。

よくよく考えると、ジェネリックラムダ自体が関数オブジェクトである。

わざわざラムダを再帰させる関数オブジェクトを別に作る必要がないのではないか。

その謎をあきらかにすべく我々はアマゾン奥地へ向かった

 

ジェネリックラムダオンリー再帰

まず、koturnの日記にも書いてあるmemberとして関数を持つタイプの実装を考える。

さて、ラムダ式がメンバを持てれば同じことができるのではないだろうか?

もうおわかりだろうが、ラムダ式のメンバのようなものはある。

そう、初期化キャプチャである。

 

Y コンビネータ

初期化キャプチャにFixPointに渡しているようなラムダ式を直接書いてしまえばいいのである。

あそれ。

ジェネリックラムダラムダオンリー再帰の完成である。

ほぼほぼYコンビネータである。

Wandboxで実行する

Z コンビネータ

koturnの日記には関数テンプレートを使った実装もあった。

さて、これもラムダだけでやってみようか。

あそれ。

ジェネリックラムダラムダオンリー再帰の完成である。

今度はZコンビネータを書いてみたぞ。

Wandboxで実行する

 

  • このエントリーをはてなブックマークに追加
  • Pocket

コメントを残す

*

This site uses Akismet to reduce spam. Learn how your comment data is processed.