functional programming in scala reading #2

19
Functional Programming in Scala Reading #2 Sep 19 2013 Naoyuki Yamada Software Engineer@AMoAd https://github.com/chokkoyamada

Upload: naoyuki-yamada

Post on 21-May-2015

811 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: Functional Programming in Scala Reading #2

Functional Programming in Scala Reading #2Sep 19 2013

Naoyuki YamadaSoftware Engineer@AMoAdhttps://github.com/chokkoyamada

Page 2: Functional Programming in Scala Reading #2

• Functional Programming in Scala(by Paul Chiusano and Rúnar Bjarnason)の読書会http://www.manning.com/bjarnason/

• 毎週木曜日17:00~18:00@渋谷マークシティ

• AMoAdの社内勉強会

• 今回は第2回。第1回の資料はこちらhttps://speakerdeck.com/potix2/fpscala-chapter1

これは何?

Page 3: Functional Programming in Scala Reading #2

開発環境構築(1/2)

• 書籍用のレポジトリをcloneしてくるhttps://github.com/pchiusano/fpinscala

• IntelliJ Idea+ scala plugin+ sbt plugin+ sbt-idea(https://github.com/mpeltonen/sbt-idea)

• chmod a+x ./sbt //実行権限付与

• ./sbt //初回にsbtがセットアップされる

Page 4: Functional Programming in Scala Reading #2

開発環境構築(2/2)

• sbt-ideaプラグインをプロジェクトに追加#project/plugins.sbtに下記を記述

• ./sbt gen-idea //IntelliJ用のファイルを生成

• IntelliJ Ideaでプロジェクトを開く

• 任意のコードのデモはIntelliJの中のScala Worksheetを使います

addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.5.1")

Page 5: Functional Programming in Scala Reading #2

Chapter2Getting Started

Page 6: Functional Programming in Scala Reading #2

2.1 Introduction

• Scalaと関数型プログラミングの導入

• Scalaの実際のコードをみていく

• 高階関数(higher-order functions: 関数を引数や戻り値にする関数)の紹介

Chapter 2の概要

Page 7: Functional Programming in Scala Reading #2

2.2 An Example Scala Program

• MyModuleというサンプルコードの説明

• Scalaの特徴(一部)objectはシングルトンオブジェクトでclassとは別。その代わりJavaと違ってstaticはない戻り値の型は省略可能unit型≒void

valで宣言した変数はimmutable

Page 8: Functional Programming in Scala Reading #2

2.3 Running Our Program

• scalac hoge.scalaでコンパイルしてscala

hogeで実行

• scala hoge.scalaで直接実行もできる

• REPLで:loadで読み込んで実行するやり方もある

Page 9: Functional Programming in Scala Reading #2

2.4 Modules, objects and namespaces

• モジュールやネームスペースはJavaとほとんど同じ

• 違うところPrimitive型はなく、全てがオブジェクト“+” “%”などはoperatorではなくmethod

Page 10: Functional Programming in Scala Reading #2

2.5 Function objects: passing functions to functions

• 再帰(recursion)について

• tail call optimization(末尾呼び出しの最適化)

→必要なら@annotation.tailrec

• 高階関数の簡単な例:formatResult()

Page 11: Functional Programming in Scala Reading #2

Exercise 1

• n個目のフィボナッチ数を求める関数を書け。最初の2つの数は0と1。ローカル関数の末尾再帰を使うこと。

def fib(n: Int): Int

Page 12: Functional Programming in Scala Reading #2

2.6 Polymorphic functions: abstracting over types

• Polymorphic function(ポリモーフィック/多相型関数, 別名generic function)は1つだけでなく多くの型に対して使える関数

• 型パラメータの機能を使う→Javaのジェネリックに相当(少し違う)

Page 13: Functional Programming in Scala Reading #2

2.7 Anonymous functions

• Anonymous function(無名関数)について→a.k.a. lambda

• ‘(引数) => 関数の中身’ という形式で記述

Page 14: Functional Programming in Scala Reading #2

Exercise 2

• isSorted関数を実装しなさい。次のような比較関数を使ってArray[A]がソートされているかどうかチェックすること。

def isSorted[A](as: Array[A], gt: (A, A) => Boolean): Boolean

Page 15: Functional Programming in Scala Reading #2

2.8 Following types to implementations

• 部分適用(partial application)

複数の引数を取る関数の一部だけに実引数を適用する操作のこと(Wikipedia)

def partial1[A,B,C](a: A, f: (A,B) => C): B => C = (b: B) => f(a, b)

→この場合 aというA型の引数が与えられるとB型を引数にとってC型を返す関数が一意に定義できる

Page 16: Functional Programming in Scala Reading #2

Exercise 3

• 2つの引数を持つ関数fを、1つの引数をとってfに部分的に適用する変換を行うカリー化をしなさい。

def curry[A, B, C](f: (A, B) => C): A => (B => C)

Page 17: Functional Programming in Scala Reading #2

Exercise 4

• uncurry化をしなさい。

def uncurry[A, B, C](f: A => B => C): (A, B) => C

Page 18: Functional Programming in Scala Reading #2

Exercise 5

• 次の2つの関数を組み立てる高階関数を定義しなさい。

def compose[A, B, C](f: B => C, g: A => B): A => C

Page 19: Functional Programming in Scala Reading #2

2.9 Conclusion

• 関数型プログラミングの基本をさらった

• 再帰、高階関数、ポリモーフィック関数

• 正確な実装は型に従って導かれる→ “follow the types to the collect implementation”の訳

• これらの原則は大規模なプログラミングでも同じ