関数型言語のメリットである「アルゴリズムに集中できる」の意味がわからなかった

公開日: : 最終更新日:2016/01/23 scala, プログラミング

関数型言語のメリットである「アルゴリズムに集中できる」の意味がわからなかったので、C言語と比較して理解した。ようやく理解したよ。

関数型言語のメリット

いろいろ調べてみて関数型言語のメリットがいくつか出てきたが、一番下だけがよくわからなかった

  • 副作用がない ← 便利
  • 型推論 ← わかる。便利
  • 制約の充足チェック ← なんとなくわかる
  • アルゴリズムの開発に集中できる ← わからん

図形の座標変換を例

現座標X(x,y)を平行移動(dx,dy)、回転(θ)とすると以下のように考えることができる

平行移動

  • 座標に(+dx,+dy)する

回転

  • ( cos θ * x – sin θ * y , sin θ * x + cos θ * y )する

ある点(a,b)を中心とした回転で比較してみた

  • 回転中心を平行移動で原点に移す、(-a,-b)並行移動する
  • 原点を中心とした回転θをする
  • 平行移動で元の位置に戻す(+a,+b)

数学ぽく書くと…

座標変換 = 平行移動(+dx,+dy,平行移動(+a,+b,回転(θ,平行移動(-a,-b,X))))

と書くことができる。
要するに、平行移動と回転の最小の部品の組み合わせで表現できる。

ここで授業で学んだ、合成関数の考え方を入れると

g(f(x)) = (g . f )(x)と表現することができる。

では、手続き型の言語C言語と関数型言語のScalaで比較してみよう。

C言語

Scala言語

以下編集中

object CoordTransExample {

  class Coord(_x:Double,_y:Double) {
    val x:Double = _x;
    val y:Double = _y;
  };
  class Conf (_theta:Double,_dx:Double,_dy:Double,_ofsx:Double,_ofsy:Double) {
    val theta:Double = _theta;
    val dx:Double = _dx;
    val dy:Double = _dy;
    val ofsx:Double = _ofsx;
    val ofsy:Double = _ofsy;
  };

  def trans(dx:Double,dy:Double,coord:Coord):Coord = {
    return new Coord(coord.x+dx,coord.y+dy);
  }

  def rotate(theta:Double,coord:Coord):Coord = {
    return new Coord(
	    		Math.cos(theta) * coord.x - Math.sin(theta) * coord.y,
	    		Math.sin(theta) * coord.x - Math.cos(theta) * coord.y
    		);
  }

  /*TODO:ここを合成関数にする*/
  def convertByConf(conf:Conf, coord:Coord):Coord = {
    return trans ( conf.dx, conf.dy, trans ( conf.ofsx, conf.ofsy, rotate ( conf.theta, trans(-conf.ofsx,-conf.ofsy,coord))));
  }

  def main(args: Array[String]): Unit = {
    val figure = Array(new Coord(0.0,0.0),new Coord(1.0,0.0),new Coord(1.0,1.0),new Coord(0.0,1.0));
    val Conf = new Conf(0.0,1.0,1.0,0.0,0.0);

    val converted = figure.map( X => convertByConf(Conf, X));
    converted.map( X => println(X.x,X.y));
  }
}

 

関連記事

Github EvolutionalComputationにjDEのScala実装を追加

https://github.com/yawaip/EvolutionalComputation

記事を読む

Githubに遺伝的アルゴリズム(Real Coded Genetic Algorithm)のScala実装をアップしました。

私のGithubです。 遺伝的アルゴリズムを用いて実数問題を解くということに、興味を持

記事を読む

no image

scalaで複数ファイルをコンパイルして実行する方法

scalaで複数ファイルを作って、実行する方法がわからなくて2時間ほど時間を無駄にした。(無職なんだ

記事を読む

Github EvolutionalComputationにDEのScala実装を追加

https://github.com/yawaip/EvolutionalComputation

記事を読む

scalaでベクトルの重み計算

以下のような重みの計算を行う場合、数式通りに配列を用いて実装する場合と、行列計算で行う方法をメモする

記事を読む

Sparkを最小労力で動かす その1

VirtualBoxでCentosを2つ作ります。 HDDの容量は16GBにしておきます。

記事を読む

no image

ScalaでSparse Codingの実装を試す

Scala言語でスパースコーディング(Sparse Coding)を実装している人が居たので試してみ

記事を読む

no image

scalaでディープラーニング実装

scalaでディープラーニング実装しようかな。 需要あれば実装します。

記事を読む

no image

Scala IDE ( Eclipse )でgithubに接続する

何回やっても忘れてしまって、作業に手間取ってしまうのでメモします。 プロジェクトのところで→[

記事を読む

no image

scala再帰

総和を求める。 def sum(ar:List[Int]) : Int = {

記事を読む

no image
メタニウムMGLとカシータスMGLの飛距離について

メタニウムMGLとカシータスMGLは飛距離については一緒らしいです。

no image
ゾディアス166m-2とクロノス662mbの比較

どうも2ピースロッドが大好きなヤワイです。 同じスペックの竿を2

no image
エリアトラウトで村田基さんの真似を辞めたら釣れるようになった

半年ぶりの更新です。 今年一年は、仕事が忙しくほとんど釣りに行け

上からクロノス、エアエッジ、ブレイゾン、ゾディアス
クロノス 672MHB 使ってみてのレビュー

クロノスロッドはかなりイケてるロッドの気がして、3月に購入してから2回

趣味にエリアフィッシング(ニジマス釣り)をおすすめする7つの理由

休みの日が雨だと何もやることがなくて嫌ですね。昔は雷さえならなければ釣

大好き片倉ダム(笹川湖)~ボート屋紹介~

亀山ダムの釣果情報を出しているページを運営しているものの、なんだかんだ

ピニオンギアのスペースチューニング
アルテグラチューニング

久しぶりの投稿です。 最近、エリアトラウトにどっぷりはまっており

素人がエリアトラウトで人並みに釣ることができるようになるまで

エリアトラウトに始めて2ヶ月が経ちました。完全にハマってます。 技量

王禅寺フィッシュオンへのアクセス1
初エリアトラウトにフィッシュオン王禅寺に行ってきた(公共交通機関でアクセス編)

前回の投稿以降、更新を忘れていたので書きます。 私は車やバイクを

【最安か?】上州屋渋谷の創業祭でジリオン SV TWが10%オフだった

なかなか今年の初バス釣りの予定がたちませんね。 グラフから釣行日

→もっと見る

PAGE TOP ↑