..


スポンサーリンク

Rubyで関数型プログラミング

アレッシオSaltariniによって書かれた記事
ページ1の2

はじめ

関数型プログラミング(FP)は、で"ラムダ計算"として、伝統的(構造的または命令型プログラミングとオブジェクト指向プログラミング)を発明したのプログラミングパラダイムの代替であるアロンソの教会 、それが知られていたも前に、30年にその正確にそれがコンピュータだったもの。

教会の研究はプログラミング言語Lispの発展の基礎を務め、その後、彼らはほぼ完全に放棄され、基本とパスカル、Cのように生成された彼らは命令型プログラミングを請求されるコンピュータ、および今日の現代的なC + +とJavaの。

ラムダ計算の基本的な考え方は、コンピュータプログラムは、パラメータ数が同じである一連の機能で、代わりに指示一連の必須(その後、その操作を行う、これを行う、これを行う)と、表現することができるということです機能。

機能的なプログラムは、通常のように、入力として入力として別の関数をとる他の関数を取る関数で構成されています。

これは、命令型パラダイムまたはオブジェクトで記述された従来のプログラムは、、その値がプログラムの"状態"を表す変数に作用する一連のコマンドで構成されている間、変数の概念そのもので関数型プログラミングが存在しないことを意味します(ある"状態"の概念がない)と実行が一定の機能を操作する関数の数に委託です。

関数型言語への関心は、特にいくつかの理由、学習の難しさ(通常、彼は数学者でない限り、人間は、オブジェクトではなく、関数の考えている!)そして、発見の難しさのために時間をかけて失われています効率的なインタプリタやコンパイラ。

RubyとFP

関数型プログラミングはそれで非常に貴重なの帰結をもたらすので、今日、この関心は、しかし、覚醒されています:それは実行時のバグへの定義の鉛できません。 言い換えれば、コンパイル時または最初の時点で、それのどちらかが動作するか動作しません。 先験的に(機能的なプログラムで、実際には、例外の概念がない)予想ではない方法で行動することはできません。

こうして誕生したと、一部は次のような関数型言語(多かれ少なかれ、純粋、そして伝統的なプログラミングのための多かれ少なかれサポート付き)繁栄されています:ML / OCamlでHaskellのF#を

Rubyは関数型言語ではなく 、私たちは、より多くの合成より強力でより効果的なアルゴリズムを定式化するのに役立つ機能的なプログラミング手法を使用しています。 つまり、通常、読みやすく以外に。

それぞれとマップ

何らかの方法でFPでサポートする言語の第1の特徴は、機能的なあなたの標準ライブラリの反復子を持っていることです。 次に例を示します。






 $の要素= [1,2,3,4,5]







 Elementi.map $ {| elemは| putsのelemは} + 1



関数は、Rubyの"マップ""各"は応用FP以外の何者でもありません! 実際には引数として他の関数を持つ関数があります。 Rubyでは、次に、{}または終了/無名関数の間で囲まれたコードのブロックの部分は、多くの関数のトピックとなるように構築されている。

これらの関数は、FP の高次機能、入力などの多くの関数としてとる、すなわち機能で呼び出されます。

古典や数学関数などの特定の"マップ"行為で、次のように読み取ることができます:1から5までのシリーズの各要素に対して、関数を実行します:次の自然数を印刷する。

コレクションの各要素に対してその"地図"または"関連付けて"、(我々が言うのRubyのArray)ブロックで定義されている特定の機能。

同じことがで自然に起こるでしょう:

 



 $ Elementi.each {...}

 
クロージャ:procとラムダ

大幅に機能(たとえば、グローバル変数または他の関数の変数)とは異なる文脈での生活に作用する変数の関数を定義する機能:クロージャは、高次の機能に似た概念です。

Rubyでは、私はキーワードProc.newまたはlambdaで定義できる無名関数を使ってクロージャを書くことができます

次に例を示します。






 DEFの乗算(乗数)



    



 {| N | N *乗数}ラムダを返す







最後に









 per3 =乗算(3)









 per3.callプット(3)#=> 9







 per3.call(per8.call(2))#=> 48を置く



まだ正確に自明のこの例では、私は機能"乗算"を定義する。 その奇妙な、この関数は何ですか? ここで私は単純に任意の変数を使用しないでください!

引数が変数の乗数でない場合は、単に定数または別の関数のプレースホルダです。

しかし、従来のプログラミングでは、私が記述します。






 DEFの乗算(A、B)



    



 * bを返す







最後に









乗算(3.3)置く



見られるように、しかし、私はすべての乗算"X3"の動作を定義する私はper3を呼び出す"演算子を"、使用してクロージャを定義する。 それから私はこの演算子番号3を呼び出します。 私もそれを再帰的に呼び出すことができます! または別の関数で、定数の代わりに、それを呼び出す。

このように、2つの数字の掛け算を制限する - - 従来のプログラミングでは、しかし、私は事前にトランザクションに関与する変数の数を定義するために強制していますと、最も重要な、私は状態の概念を挿入する必要があります、という2つの変数のメモリを割り当てる乗算する値が含まれています。

同じカテゴリの...
E -ラーニング
RubyとRuby on Rails(コース) RubyとRuby on Rails(コース)
RubyとRoRのと、ソフトウェアやWebアプリケーションを作成します。 39€から。
スポンサーリンク