:pぴー.sendせんど(:pぴー, :pぴー)

mokoaki
mokoriso@gmail.com

2017/02/27

関数型プログラミングとはいったい……うごごご!

とりあえず、どうすべきなのよ

これ

関数型プログラミング使いとは

関数型プログラミングが可能な言語

関数型 <=> 命令型

関数型のメリット(らしい

1 置換ルール

当然のように思えるが

var hage = (a) => {
  return a + 2;
}

// hage(1)
// => a + 2
// => 1 + 2
// => 3

// 関数内部での a => 1 の置換が行われる(らしい・・これって凄いのか・・?

2 計算の過程の明示化

var add = (a, b) => {
  if (b === 0) {
    return a;
  }
  else {
    add(a + 1, b - 1);
  }
}

// add(1, 3)
// => add(2, 2)
// => add(3, 1)
// => add(4, 0)

// どのように計算が進んでいくか捉えやすい(らしい

3 高階関数

変数

バインド・束縛

値を変数に対応付ける事

// これ
var moko = "hage";

代入

変数の内容を更新する事。代入は変数の参照透過性を破壊する

var moko = "hage";

// これ
moko = "husa";

参照透過性

参照透過性を破壊するもの

可変データ(配列、ハッシュ、オブジェクト等 値の参照透過性を破壊する
代入 変数の参照透過性を破壊する
副作用 関数の参照透過性を破壊する

参照透過性 [値]

プリミティブなリテラル値は参照透過性が保たれてる!すごーい!

1 === 1;
=> true

参照透過性 [変数]

当然のように思えるが

var hage = 1; // hageに1をバインド
hage === 1;
=> true

// この時点でhageの参照透過性は保たれている

hage = 2; // hageに2を代入
hage === 1;
=> false

// hageは 1 と言ったら、そのコンテキスト内では必ず 1 でいてほしいの!
// 代入は参照透過性を破壊する
// 同じ理由で破壊的メソッド(関数)も使用禁止

参照透過性 [関数]

var x = 0;

var add = () => {
  x = x + 1; // これはバインドではない 代入である
  return x;
}

add() === add()
=> false

副作用

代入の有無とは関係なく、もともと参照透過性のない関数がある

Date.new() 外部環境
Math.random() 外部環境
console.log() 画面
File.read() 外部ストレージ
DB.where() 外部ストレージ
Net.get() ネットワーク

値の参照透過性を保証する

可変なデータ型を使わなきゃいいじゃない!(配列、ハッシュ、オブジェクト型等)

変数の参照透過性を保証する

関数の参照透過性を保証する

このmoko関数は今日と明日では違う結果を返す。つまり参照透過性がない。純粋な関数でない

var moko = () => {
  return new Date().getDate();
}

moko()
=> 1

このmoko関数は副作用を持たなくなり、参照透過性がある、純粋な関数になった

var moko = (date_object) => {
  return date_object.getDate();
}

moko(new Date());
=> 1

もう一つ例

var moko = (hage) => {
  var result = (hage === true) ? "hage!" : "mada!";

  console.log(result)
}

moko(true);
=> hage!

ではなく、

var moko = (hage, console_log) => {
  var result = (hage === true) ? "hage!" : "mada!";

  console_log(result)
}

moko(true, console.log);
=> hage!

参照透過性・・やっぱよくわからない たぶん、みんな判ってない

ぐぐってそれっぽいものを並べる

ダメだ わからん

参照透過性を理解したければ哲学者とか理論学者になるしかない

もうこれだけでいいんじゃないだろうか

「お前、参照透過性まだ理解してないの?」とか言う奴がいたら