分かりやすい関数型言語入門を考える


## 分かりやすさとは？

人にものを説明するときには、自分の言語体系ではなく相手の言語体系で表現しなければ伝わりにくくなります。
関数型言語は学術的な領域で使われている事が多いため、それ以外の人達の間ではなかなか読み辛いものになってしまいます。

よく言われる良書と呼ばれる本は学術的に良い本である事が多いようです。
しかしこれらの本は学術的な記述で書かれているため、気軽に読むには難しく感じてしまいます。

* 正確な書籍
* 不正確でも分かりやすく取っ付きやすい書籍

これらの２つの系統があってよいはずで、初心者には不正確でも分かりやすく取っ付きやすい書籍のほうが好まれるでしょう。出来れば、正確であるのが理想ですが、初心者に取っては大まかな概要がわかればよいわけです。
より興味がわいて来たら、より正確な書籍を買えばよいのです。最初から正確な本を読める人は多くないので、ユーザーがなかなか増えません。

### 例) イミュータブル 書き換え不能なデータ

基本的に関数型言語のデータはデザインパターンで言うところのイミュータブルパターンのオブジェクトとして扱われます。一度データを作成したら変更する事が出来ません。

Javaで書くと以下のようなクラスです。

```java
class Data {
  private int x;
  public Data(int x) {
    this.x = x;
  }
  public getX() {
    return x;
  }
}
```

Data v = new Data(1)として生成し、v.getX()として値を参照する事が出来ますが、xの値を変更する事は出来ません。

関数型言語と呼ばれる言語の多くはこのようなデータのパターンを書きやすく設計されています。

Javaのユーザーを対象とすれば以上のように、記述する事でより理解がしやすくなるでしょう。

## 関数型言語の簡単な説明

説明に必要そうな項目を箇条書きにしてみましょう。

* 変数に代入する事は出来ず、値は束縛する。
* 基本的にデータは書き換え不能である。
* 値を書き換えたい場合は新しい変数を生成する。
* プログラミング技法のこと。
* 関数を組み合わせてプログラムを行う。
* 関数がファーストクラスのオブジェクトである。
* 関数を返す関数等が作れる。
* 結果的にプログラムは短く美しくなる。
* 最適化しやすい。
	* 完全に書き換え不能であれば、式を自由に変形出来る。
	* 式を変形する事で最適化が行える。
	* 処理順が不定であればよりよい最適化が可能である。
	* メモ化
	* 遅延評価
	* 末尾再帰最適化
	* SSA最適化
* クロージャ
	* 書き換え可能な変数とクロージャを使うとオブジェクト指向のクラスが作ることが出来る
* GCが必要

## わかりやすい技法について


### ライトノベル風に書く技法

* 夢のある設定がよい
* 18歳の女子高生は最強？
* さらっと読めると嬉しい
* 対話する形式で書く

#### ライトノベル風

* 数学ガール

ライトノベル風に書く事で、気軽に読む事が出来ます。萌系のアニメーションが好きな人と、嫌いな人で好みが別れるところでしょうが、現在のアニメーションが萌系のアニメーションが多い事を考えると、萌系であるほうがより好まれるでしょう。しかしこのような好みは時代とともに変わる物であるので、普遍的ではありません。

#### 脚本、リプレイ風


* [解析魔法少女美咲ちゃん-マジカル・オープン!](http://www.amazon.co.jp/%E8%A7%A3%E6%9E%90%E9%AD%94%E6%B3%95%E5%B0%91%E5%A5%B3%E7%BE%8E%E5%92%B2%E3%81%A1%E3%82%83%E3%82%93-%E3%83%9E%E3%82%B8%E3%82%AB%E3%83%AB%E3%83%BB%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3-%E3%82%84%E3%81%AD%E3%81%86%E8%A7%A3%E6%9E%90%E3%83%81%E3%83%BC%E3%83%A0/dp/4798008532)
* [ひなた先生が教えるデバッグが256倍速くなるテクニック (Software Design Books)](http://www.amazon.co.jp/dp/4774136689/ref=pd_lpo_sbs_dp_ss_2?pf_rd_p=187205609&pf_rd_s=lpo-top-stripe&pf_rd_t=201&pf_rd_i=4798008532&pf_rd_m=AN1VRQENFRJN5&pf_rd_r=1FPQ9FCMWMT01RH5AEBV)

キャラクターの絵があって台詞があるのは、RPGのリプレイに近い気がする。
台詞が書いてあるだけなので脚本にちかいのかもしれない。

### 面白そうな設定、企画

* リアルな女子大生が教える関数型入門。
	* 男が想像で書くのもいいけど、実際の女子大生が書くとかだとやっぱり違うよさがある。
	* お嬢の休日は eggs benedict とアールグレイ
* 関数型アイドル
	* 関数型アイドルがグループ抗争をしてるみたいな設定
	* みんな仲間で、説明途中に色々とやって来る
	* 突然バトルが始まったりする
* ヤッターマン的な設定
	* 敵はドロンジョ様的なキャラと手下２人くらいいて、悪の組織に動かされている
	* 見方は２人くらいいて、師弟関係などになっている。
* チャーリーエンジェルス的設定
	* 謎の関数型組織のチェリーウェル財団のチェリーエンジェルスが悪の組織と戦う
	* チェリーは謎に包まれており会う事が出来ない
	* 海外に住む組織のメンバーが色々と協力してくれる
* 禅
	* お茶の心が世界を救うみたいな
	* ジョブズっぽい謎の外国人がいる
		* 薬を決めてラリっている
	* 陶芸をしている
	* お茶会をする
		* 現代茶道では、お茶、コーヒー、ジュースをうまく使い分ける。
		* スイーツも重要である。
	* 禅問答を行う
* 学会
	* 関数型言語をこよなく愛する
	* 論文を書くのに関数型言語を用いている
	* 温泉でまったりする
* プログラミングコンテスト
	* バトルの場の１つがプログラミングコンテストである。
* 勉強会
	* 勉強会の会員というのがいて、言語アイドルが存在する。
	* 関数型アイドルは言語アイドルの一種だ。
	* 言語アイドルはエバンジェリストとも呼ばれる。
		* 言語アイドルはだいたい好きな食べ物がある。
		* カレーが好きな言語アイドルは黄色でなくてはならない。
* アイドルの塔
	* 各アイドルはアイドルの街に住んでいて、色々な塔に所属していたりする。
* 関数型ウォッチ
	* 関数型アイドルは腕時計を格好良く使う。
	* 太っているアイドルは腕時計を使って痩せようとしている。
	* 走るのが好きなアイドルは走ってる。
	* 腹筋を割ろうとしているアイドルがいる。
	* 関数型ウォッチは防水だが、外れて流してしまって捜索する。
* 関数型グラス
	* 関数型アイドルの標準装備の一つが関数型グラスである。
	* 関数型グラスを使う事で、エージェントと話す事が出来る。
	* 関数型グラスがあるのでディスプレイは必要ない。
* ドスキボー(ドローンズスケートキーボード) 
	* 関数型アイドルはドローンズスケートキーボードに乗って移動する。
	* ドローン２台にキーボードのついたスケボーを付けて移動可能である。
	* スケボーにはキーボードがついていて、ドローンで飛ばしながらキー入力を行う。
	* ドスキボーにペットの猫を乗せているアイドルがいる

## 絵文字

:bust_in_silhouette: 一般人
:bust_in_silhouette: ずっと一般人の謎キャラ。ゴキゲンヨウ。諸君。元気かね？
:busts_in_silhouette::bust_in_silhouette::busts_in_silhouette: 一般ピープルズ
:busts_in_silhouette::bust_in_silhouette::busts_in_silhouette: 関数戦隊アイドルズ見参
:baby: :baby_bottle: 
:boy: 男の子 :girl: 女の子
:person_with_blond_hair: 外人
:person_with_pouting_face: おねいさん
:woman: こんにちは
:princess: 姫
:bride_with_veil: 花嫁
:cop: 警察
:man: つ:coffee::cocktail::tea::cake::doughnut:コーヒーを入れました。皆さんどうぞお飲みください。
:man_with_turban: カレー好きアイドル:curry: 
:man_with_gua_pi_mao: 多分中華系アイドル:ramen: 
:question: ゴキゲンヨウ。諸君。私はミスターXっぽいやつ。
:older_man: じいさん :older_woman: ばあさん 
:guardsman: 警備員

:camel: :dromedary_camel: OCamlな人
:couple: :couple_with_heart: :couplekiss: リア充
:two_men_holding_hands: 男ペア
:two_women_holding_hands: 女ペア

:alien: ダベー
###ペットorエージェント

:cat::crying_cat_face::heart_eyes_cat::joy_cat::kissing_cat::pouting_cat::smile_cat::smiley_cat::smirk_cat::scream_cat: :feet: ペットからの手紙に使う
:cat2: ペット２号だよ
:baby_chick: :hatched_chick: :hatching_chick: :penguin: :bird: :chicken: 
:hamster: ペット３号
:dog: :dog2: 犬です。
:leopard: 
:mouse2: :mouse:
:ox:
:panda_face:
:pig2: :pig2: :pig_nose: 
:rabbit2: :rabbit: 
:rat: あ
:koala: 
:sheep: 
:tiger2: 
:tiger: 
:wolf: 
:angel: 
:bear:
:ant: :beetle:  :bee: :bug: 
### アイテム
:watch: 関数型ウオッチ
:eyeglasses: 関数型グラス
:fr: OCamlはおフランスの言語っと
:jp: 
:leaves: お茶っ葉
:ru: 
:shaved_ice: 
:us: 
:wine_glass: :beer: :beers: 
:rose:
:apple: :banana: 
:cake: :candy: :cherries: :cherry_blossom: :chestnut: 
:chocolate_bar: 

:construction_worker: 
:custard: 


:feelsgood: 
:finnadie: finnadie 
:goberserk: goberserk 
:godmode: godmode 
:hurtrealbad: hurtrealbad 
:rage1: rage1 
:rage2: rage2 
:rage3: rage3 
:rage4: rage4 
:suspect: suspect 
:shipit: