読者です 読者をやめる 読者になる 読者になる

Scala関西Summitの関数プログラミングことはじめを復習した #scala_ks

Scala

遅ればせながらScala関西 Summit 2015の復習です。2015年8月1日(土)開催でしたw
関西に来てすぐの頃、Scalaを1文字も書いたことがないのに参加しました。

最近は遂に職場でScalaを書くことに…(震)となっている私ですが、
@kitora_naokiさんの【ハンズオン】関数プログラミングことはじめ
ものすごく分かりやすかったのを思い出し、要点を再度確認しました。

"関数型言語っぽい書き方っぽいことはほとんどやったことなく、
コード見ても何これワカランとなる人(私)"にとてもよいハンズオンだったと思います*1!!
すこーし数学の話も出てきましたが、文系数学(?)の知識だけで全然問題ないレベルで
むしろ数学さんが全力で理解を助けてくれてね、本当に助かりました。
なお、当日はScala Worksheetを使って進めていきました。

10/24追記:@kitora_naokiさんが資料アップしてくださったー!!!


はい。さて行ってみよう。
ポイントは1つで、漸化式と同じ考え方をすること!!!

def f(n: Int): Int =
  if (n == 0) 5
  else f(n - 1) + 3

さてこれ、何をしているか。Javaの頭だとぱっと見「?」となったりする…。

そこで漸化式の考え方を脳みその古い箪笥から引っ張り出してくるのだ。
結論から言うと、上は初項5、公差3の等差数列なんですね*2
高校だか中学だかで習った数学だとこういう書き方をしたはず。

a1 = 5
an+1 - an = 3

はい。どうでしょうか。私は、
はぁぁあああなるほどああうおああぁぁあああって。なりました。

例えば3番目の項を求めたいとします。
分かりやすいよう試しに上の漸化式を地道に辿ってみましょう。

a1 = 5
a2 = a1 + 3 = 8
a3 = a2 + 3 = 11

ここで話を戻してはじめに例示したScalaのコードで同じことを考えると…
さっきまで読み解きづらいと感じていた関数ですが、上の漸化式と同じことしてると考えれば

f(2)

11が返ってくる、というのもかなり納得できます。


「何をそんな初歩的なことを」とか「コードから直接それを読み取ればいいのに」とか
思われるかもしれませんが、

  • Scalaを読み解く:新しくて、チャレンジングなこと
  • 漸化式の考え方を使う:多少なじみある発想で、すんなり理解しやすいこと

なのです、私にとっては(伝わるかなぁこの違い…)。
読めんと思った未知のコードを、脳みそにある既存のフロー(?)につっこんで処理出来た感じがして
はぁぁあああなるほどああうおああぁぁあああって。なりました。
解釈の仕方を掴んだというか…。


1時間のセッションだったので他にも色々な例を出して下さいましたが、
正直さっきの一例で私のアハ体験については語り尽くすことが出来ちゃった…。

おまけに当日のノートが手記はここで途切れている状態なので(どうした)
あとは思い出せる範囲でコードだけメモ書き程度に残しておきます。
私みたいな超初心者の方、この記事が目に止まったら、何が起きているか考えて
頭の体操してみてください!w
@kitora_naokiさん、本当にありがとうございました。


def f(n: Int): Int =
  if (n == 0) 0
  else f(n - 1) + n

0からnまでの和が出せます。f(10)だったら55ですね。
n-1までの和に、nを足しているんだなぁとすんなり理解できます。
༄༅༄༅༄༅༄༅༄༅༄༅

def f(n: Int): Int =
  if (n == 0) 1
  else f(n - 1) * n

こんどは、0からnまでの積です。
༄༅༄༅༄༅༄༅༄༅༄༅

def f(n: Int): Int =
  if (n == 0) 1
  else if (n == 1) 1
  else f(n - 2) + function(n - 1)

フィボナッチ数列
༄༅༄༅༄༅༄༅༄༅༄༅

def sum(list: List[Int]): Int =
  if (list.isEmpty) 0
  else list.head + sum(list.tail)

リストの要素の和!
༄༅༄༅༄༅༄༅༄༅༄༅

def multiple(list: List[Int]): Int =
  if (list.isEmpty) 1
  else list.head * multiple(list.tail)

リストの要素の積!

並べただけですが、おしまいでーす。


✪おまけ
IntelliJ IDEAにたくさんうずまき🌀が出てきて何かと思ったら
recursiveということを教えてくれていました🌀🌀🌀🌀🌀
f:id:ihcomega:20151018173258p:plain

*1:うろ覚えですが…あくまでも関数プログラミングはじめの一歩を踏み出すためのコードですというようなことをおっしゃっていた気がします。違う観点で見ると直したくなるようなコードがあるということかもしれません。確か末尾最適化がどうとかこうとか。まぁ今の私にはその判断もつきませんすみませんすみません…

*2:たしかハンズオンの際は、ここまで簡単な例は出なかった気がします。分かりやすさのため、私が勝手に等差数列を持ち出しています〜