c4se記:さっちゃんですよ☆

.。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆)

.。oO(此のblogは、主に音樂考察Programmingに分類されますよ。ヾ(〃l _ l)ノ゙♬♪♡

音樂はSoundCloud等バラバラの場所に公開中です。申し訳ないがlinkをたどるなどして探してください。

考察は現在は主に此のblogで公表中です。

programmingは、ひろくみせるものはGitHubで、個人的なものはBitBucketで開発中です。

c4se

Rubyでcurry化しない関数合成

Rubyではcurry化する方が難しいのだけれど。
Rubyの関数合成で調べれば延々と結果が出てくるので私のcodeを信用しないやうに。
cf. 「関数型Ruby」という病(2) - 関数合成 Proc#compose - ( ꒪⌓꒪) ゆるよろ日記 http://yuroyoro.hatenablog.com/entry/2012/08/09/203959
cf. 「関数型Ruby」という病(3) - カリー化(Proc#curry, Proc#flip) - ( ꒪⌓꒪) ゆるよろ日記 http://yuroyoro.hatenablog.com/entry/2012/08/10/232443
cf. 「関数型Ruby」という病(6) - 関数合成と文脈、Proc#liftとProc#>=、そしてモナ - ( ꒪⌓꒪) ゆるよろ日記 http://yuroyoro.hatenablog.com/entry/2014/02/17/100527

# license: Public Domain

# @param [(Proc|lambda)[]] *fs
# @return [Proc]
def compose *fs; proc{|*args| fs.inject(args){|args, f| f.call *args } }; end

戻り値の個数と、次の関数の引数の個数が一致してれば合成できる。折角curry化してない世界なので、複数の関数を一気に合成できる。curry化された世界では、関数合成する関数もcurry化されてゐるべきだから。

compose(
  ->(n){ [n, n + 1] },
  ->(n, m){ [n * 2, m] },
  ->(n, m){ n + m }
).(8)
# => 25

cf. アリティ付きフラット・ラムダ計算 (1) - 檜山正幸のキマイラ飼育記 http://d.hatena.ne.jp/m-hiyama/20130902/1378078580
cf. アリティ付きフラット・ラムダ計算 (2):モジュールの概要 - 檜山正幸のキマイラ飼育記 http://d.hatena.ne.jp/m-hiyama/20130903/1378178593
cf. ラムダ計算について2013年に思うこと - 檜山正幸のキマイラ飼育記 http://d.hatena.ne.jp/m-hiyama/20130904/1378255365