2014年5月2日金曜日

Functional Programming Principles in Scala (Week 1)

#Coursera Functional Programming Principles in Scala
Week 1: Functions & Evaluations

1週目が始まった。
資料の提供が予定より少し早いが、予定前には出すという意味かな。
字幕に間違いが多い。sbt->svtとか、call->coreとか、REPL->rippleとか。
知らないで見ていると余計に混乱するかもしれない。

今回は別にscala本を読んでいるので内容的に知っているところが多くて特に難しくないが、初めてのモノだと予習していないと結構つらいかも。
ノートを作る必要もあるかもしれない。

[Lecture 1.1]
smalltalkやrubyも関数型としていた。blockを渡せるのが関数値と同等。

[Lecture 1.2]
call by valueとcall by nameの説明。lazy評価と関係あり。call by nameの利点を挙げていた。

[Lecture 1.3]
call-by-value vs. call-by-name
scalaは通常はcbvを使う。
同じ計算を複数回行う必要がないので効率的。
命令型のサポートとも相性が良い。副作用の順番も自然になる。
cbnを使いたときはパラメータのannotationに=>を付ける。
cbnを使えば遅延評価となり値が必要となるまで評価されない。

[Lecture 1.4]
ここでもcbvとcbnの話が出てくる。この違いにこだわりがありそう。
defはcbnでvalはcbv
a && bはcbnでdef and(a: Boolean, b: => Boolean) if (a) b else falseと等価
&&, ||はshort-circuit evaluation

[Lecture 1.5]
ニュートン法による平方根の求め方。再帰の練習。適切な終了条件の考察あり。

[Lecture 1.6]
lexical name scope, blockの外側の値はパラメータ渡し無しで使うようにする。
置き換えモデルによる表現の簡略化が今後のセッションでも重要なツールになる。

[Lecture 1.7]
tail recursion, tail call
最大公約数(ユークリッド法)と階乗を求めるプログラムの比較。
substitution modelでどんどん長くならければtail recursion.
階乗を求めるプログラムもパラメータを増やすことでtail recursionに変更出来ていた。
** スライドが中途半端なのと2week-1だと言っている。。。資料の完成度は高くないのかも。
クイズはvideoの中の設問の事で別途問題を解く必要はないらしい。。。

[Assignment: Recursion]
パスカルの三角形、カッコの対応チェック、両替パターン数のカウントの3問
結構手間取ったが、1回目で10点満点を獲得!

[その他]
Week 1を完了!

IntelliJ Ideaのeclipseのプロジェクトインポートには時間が掛かる?
しばらく待っていたら、indexingとか表示されて、上手く表示されるようになった。
それでもimport common._はunusedと言われているが。。。

関数型プログラミングでは答えからそれに必要なものを遡って考える。
命令型では入力から答えを作り上げていく。
#CourseraのWeek1のRecursiveのAssignmentで改めて実感出来た。
そう考えるとcall-by-nameの方が相性が良さそう。

exceptionは副作用? 処理順に依存する。haskellでは?
純粋関数型ではexceptionは投げない。scalaのOption type的なもので処理する。
haskellでもI/Oモナド等の副作用があるものでexceptionを使っている。

0 件のコメント:

コメントを投稿