タグ

カリー化に関するtaka222のブックマーク (7)

  • JavaScript で引数束縛: Days on the Moon

    引数束縛 (カリー化) の話。まずは「JavaScriptでカリー化」(檜山正幸のキマイラ飼育記)。タイトルを見てどこかで聞いたような話だなと思ったら「関数の変形」(Effecttive JavaScript - Dynamic Scripting) だった。だが、前者は文字列に戻してから評価というのが力技っぽくて個人的に好きでないし、後者は汎用的過ぎていささかわかりにくい。そこで今回は先頭の引数から束縛していくというのに的を絞ってみたいと思う。 まず第 1 引数のみを束縛する場合。Function#apply を使えば引数を配列として渡せるので、束縛された値と後から渡された引数とを連結してやればいいのではないか。 function curry(func) { return function (first) { return function () { var args = Array.p

  • C++ lambda すーぱーぷろぐらみんてくにーーく!

    The Super Programming Technique §1.ラムダ式をC++で実現する【前編】 関数型言語の基的な概念であるラムダ式を、C++で実現する方法について紹介します。 ・高階関数(higher-order function) 他の関数を引数として扱う関数は、高階関数と呼ばれます。 「関数を引数にとる」のですが、関数を渡すためには、C++では、関数ポインタで渡すか、templateで渡すかです。(operator ( )をオーバーロードしたクラスをfunctorと呼び、これを引数templateを用いて渡すテクニックについては⇒集中講義4. 超高速描画の謎【後編】を参照のこと。) グラフィックの転送ルーチン等は、処理の99%が同じで、ピクセルをコピーする関数のみが違うという場合があります。このように、共通の処理がある場合、この高階関数にすると処理がすっきり書けます。

  • Haskellは難しくない--こともある。 : 404 Blog Not Found

    2006年06月20日18:20 カテゴリWEB+DB PRESSLightweight Languages Haskellは難しくない--こともある。 まだVol.33も正式発売されていないというのに、すでにVol.34の原稿書きにいそしむ今日この頃。実はその記事の一つがHaskellだ。「Powered by Ph.Dな言語の解説を中卒がやるのってどうよ?」と我ながら思うが、自分で言うのもなんだがむしろいい記事に仕上がってきているのを感じる。 Matzにっき(2006-06-13) 私:「Haskell難しいですから」 「ええっ?」 というわけで、予告ついでに、HaskellよりRubyの方がずっと難しいことを一つ上げさせていただく。 それは、なんといってもProcオブジェクトだ。 「Rubyの美しくない部分を一つあげよ」と聞いて、真っ先に思い立つのがこれだ。 例えば、logbXをカリ

    Haskellは難しくない--こともある。 : 404 Blog Not Found
  • A Gentle Introduction to Haskell: Functions

    [ここでの括弧は必須です。] 上の例の最後のセクションの形式は中置演算子から同等の関数値へ変換する働き をします。この形式は中置演算子を関数の引数として渡すときに便利な方法です。 たとえば、map (+) [1,2,3] のようにします。(読者の皆さ んはここで、関数のリストが返されていることを確かめてください。) 関数の型 を与える際にも必要になります。これはすでに (++) および (.) の例で示しましたね。さて、これですでに定義した add が (+)、inc が (+1) で定義できることがわかり ます。実際これらの定義がすっきりします。 inc                    = (+ 1) add                    = (+) 中置演算子を関数値に変換できましたが、それでは、その逆は可能なのでしょう か。可能です。関数値をバッククウォートで括るだけで

  • JavaScript でカリー化、再び: Days on the Moon

    以前、「JavaScript で引数束縛」において関数のカリー化を試みました。しかし、そこでカリー化された関数は、そのままでは一度しか部分適用ができず、また、最初の関数呼び出しは必ず部分適用として扱われていました。 function mean3(a, b, c) { return (a + b + c) / 3; } // 「JavaScript で引数束縛」における curry 関数。 var curriedMean3 = curry(mean3); curriedMean3(1)(2, 3); // => 2 curriedMean3(1)(2)(3); // => TypeError: curriedMean3(1)(2) is not a function // そのままでは部分適用を 2 回以上行えない。 // curry(curriedMean3(1))(2)(3) なら大丈夫

  • JavaScriptでカリー化 - 檜山正幸のキマイラ飼育記 (はてなBlog)

    JavaScriptでカリー化。ありがち、つうか実際にあるでしょうね。小ネタと思ってやりはじめたら、意外と混乱した。一種のメタプログラミングのはずだが、実際にはテキスト加工処理。 内容: カリー化ってなに? カリー化を行う関数を作る:準備 カリー化を行う関数を作る:テキストのパッチワーク カリー化を行う関数を作る:組み立て ●カリー化ってなに? 2引数の関数f(x, y)に対して、「gがfのカリー化」だとは、f(x, y) = g(x)(y) が常に成立すること -- ゴチャゴチャ説明するより実例実例: functio sum(x, y) { return x + y; } このsumのカリー化の例: function curried_sum(x) { return function (y) {return sum(x, y);} } curreid_sum関数は1引数で、戻り値として関数

    JavaScriptでカリー化 - 檜山正幸のキマイラ飼育記 (はてなBlog)
  • 高階関数 - Wikipedia

    高階関数(こうかいかんすう、英: higher-order function)とは、第一級関数をサポートしているプログラミング言語において少なくとも以下のうち1つを満たす関数である。 関数(手続き)を引数に取る 関数を返す 高階関数は厳密には第一級関数をサポートしているプログラミング言語において定義される。C言語やPascalでは、関数へのポインタを利用して高階関数を模倣することができるが、関数ポインタによって第一級関数をサポートしているとみなされてはいない。高階関数は主に関数型言語やその背景理論であるラムダ計算において多用される。 また、ある関数(手続き)の引数となる関数(手続き)のことを関数引数[1]や手続き引数[2]と呼ぶこともある。

    高階関数 - Wikipedia
  • 1