翻訳と辞書
Words near each other
・ カリール・ジブラン
・ カリール・ジブラーン
・ カリーンの剣
・ カリーヴルスト
・ カリー・ウェッブ
・ カリー・ウェブ
・ カリー・ハワード同型対応
・ カリー・ハワード対応
・ カリー・ペイトン
・ カリー・ボリー
カリー化
・ カリー郡
・ カリー郡 (オレゴン州)
・ カリー郡 (ニューメキシコ州)
・ カリー=ハワード同型
・ カリー=ハワード同型対応
・ カリー=ハワード対応
・ カリ城
・ カリ定永閃石
・ カリ岩塩


Dictionary Lists
翻訳と辞書 辞書検索 [ 開発暫定版 ]
スポンサード リンク

カリー化 : ウィキペディア日本語版
カリー化[かりーか]
カリー化 (currying, カリー化された=curried) とは、複数の引数をとる関数を、引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残りの引数を取り結果を返す関数」であるような関数にすること(あるいはその関数のこと)である。クリストファー・ストレイチーにより論理学者ハスケル・カリーにちなんで名付けられたが、実際に考案したのはMoses Schönfinkelとゴットロープ・フレーゲである。
ごく簡単な例として、f(a, b) = c という関数 f があるときに、F(a) = g(ここで、g は g(b) = c となる関数である)という関数 F が、f のカリー化である。
関数 ''f'' が f:(X \times Y) \to Z の形のとき、f をカリー化したものを g とすると、g:X \to (Y \to Z) の形を取る。uncurryingは、これの逆の変換である。
カリー化とは直感的には、「関数の複数引数を、1引数ずつ順に、バラバラにする」ということである。たとえば、除算の関数 (x, y) = \frac をカリー化したものを とすると、 はxのみを引数に取る。そして =(1) とすると、 はyのみを引数に取る新しい関数となり、(y) = \frac、つまり引数の逆数を返す関数になる。
言葉ではわかりにくいのでSchemeとJavaScriptで実装した例を示す。

(define div (lambda (x y) (/ x y)))
;(div 1 3) == (/ 1 3), これはカリー化ではない。
(define cdiv (lambda (x) (lambda (y) (div x y) )))
;(cdiv a) == (div a y)
((cdiv 10) 3)
;=> 10/3
(define inv (lambda (x) ((cdiv 1) x)))
;inv == (cdiv 1)
(inv 2)
;=> 1/2


function div(x, y)
//div(1, 3) == 1 / 3, これはカリー化ではない。
function cdiv(x)
console.log(cdiv(10)(3));
//=> 10/3 = 3.333...
var inv = cdiv(1);
console.log(inv(2));
//=> 1/2 = 0.5

理論計算機科学の分野では、カリー化を利用すると、複数の引数をとる関数を、一つの引数のみを取る複数の関数のラムダ計算などの単純な理論的モデルと見なして研究できるようになる。圏論では、カリー化の概念を冪対象普遍性に見出せる。適当な2つの対象から別の対象への f: X \times Y \to Z に対して、射 g: X \to Z^Y が一意に対応する。
カリー化をする現実の動機の1つに、カリー化することで後述する部分適用が行いやすくなることが挙げられる。たとえば、加算を行う関数 (+) をカリー化してから、最初の引数だけに 1 を適用すれば、インクリメント用の関数が簡単に作れる。
カリー化を基盤としているプログラミング言語もある。特にMLHaskellでは関数は常に一つの引数のみを取り、複数の引数を取る関数とは、単にネストされた複数の一引数関数の糖衣構文にすぎない。第一級関数を扱える言語、たとえばLISPSchemeF#ScalaErlangEiffelPerlRubyPythonR言語S言語JavaScriptSwiftなどでは、カリー化関数を作ることができる。
==他の概念との混同==
カリー化は部分適用と混同されやすい〔http://lambda-the-ultimate.org/node/2266〕〔http://www.uncarved.com/blog/not_currying.mrk〕。部分適用とは、複数引数ある関数の引数の一部だけに実引数を適用する操作のことで、上述の(x, y)の例で言えば、からを導出する操作を指す。一方、カリー化はを導出する操作であり、引数への値の適用までは行わない標準C++ライブラリstd::bind1st は部分適用の一例である。
この混同はしばしば言語設計者によってもなされる。Groovyでは、部分適用を行う標準メソッドにcurryという名前がつけられている。
また、Haskellにある標準関数curryも、一般的なカリー化と厳密には違う動作をする。この関数は (a, b) -> c という型を持つ関数を a -> b -> c 型の関数に変換するが、元の関数は2要素のタプルを取る1引数関数であり、2引数関数ではない。Haskellは上述のとおり全ての関数が1引数関数であり(つまり、全ての関数が元々カリー化された形であるとも表現される)、よってHaskellプログラムの上では、厳密な意味でカリー化を行う関数は定義できない。ただし型理論上は、X、Yという型の要素を持つタプルの型は直積 X \times Y とほぼ同一視できるため、必ずしも誤用というわけではない。

抄文引用元・出典: フリー百科事典『 ウィキペディア(Wikipedia)
ウィキペディアで「カリー化」の詳細全文を読む



スポンサード リンク
翻訳と辞書 : 翻訳のためのインターネットリソース

Copyright(C) kotoba.ne.jp 1997-2016. All Rights Reserved.