SlideShare a Scribd company logo
1 of 45
Download to read offline
関数プログラミング
ことはじめ
Scala 関西 Summit 2015
はじめに確認
JDK 入ってますか?
前提
• 厳密な正確性よりもわかりやすさを重視
Scala 難しい

という意見を聞くことがあります。
Scala は本当に難しい?
複数の要因を一緒にして
いない?
•Scala の言語仕様が難しい
•関数プログラミングが難しい
•型システムが難しい
Scala の難しさって?
•関数プログラミングが難しい
• 命令プログラミングのパラダイムとい
う先入観をもって、関数プログラミン
グのパラダイムを学ぶ難しさ
• 関数型言語が基礎とする数学概念の難
しさ
• プログラミングの難しさ
本日のテーマ
•関数プログラミングが難しい
• 命令プログラミングのパラダイムとい
う先入観をもって、関数プログラミン
グのパラダイムを学ぶ難しさ
• 関数型言語が基礎とする数学概念の難
しさ
• プログラミングの難しさ
本日のテーマ
関数プログラミングのパラダ
イムを理解するきっかけを掴
む
本日のゴール
関数プログラミングの関数
数学でいうところの関数
f(x) = x + 1
だから Scala では
•関数定義に = (イコール) を使用
•関数内で最後に評価された値が返る
Which
is
better?
def f(x: Int) {x + 1}
def f(x: Int) = x + 1
def f(x: Int) = return x + 1
※注: 上の 2つは正しいコードではありません。
関数プログラミング (狭義)
• 変更可能な変数
• 再代入
• ループなどの命令型の制御
を使わずにプログラミングすること
お願い
現時点での関数プログラミングに対する疑問を
紙に書き出してください。
2分
命令プログラマの疑問
再代入やループなしにどうやって書くのか?
int sum = 0;
for (int i = 0; i < array.length; i++) {
sum += array[i];
}
return sum;
i = i + 1;
最初に見たとき違和感ありませんでしたか?
命令プログラミング
具体的な手順を記述
関数プログラミング
対象の性質を定義
プログラミングの関心事
関数プログラミングでの問題へのアプローチ
問題を抽象化・一般化
環境セットアップ
JDK
IntelliJ IDEA
Scala プラグイン
https://goo.gl/iKyEKs
問題
ある自然数を引数にとり、0から当
該自然数までの整数の合計を返す関
数を定義せよ
命令プログラミング
• 0からnまでカウントアップ
• カウントアップした数字を足し込んでいく
int f(int n) {
int total = 0;
for (int i = 0; i <= n; i++) {
total += i;
}
return total;
}
例示して性質を抽出
f(0) = 0
f(1) = 0 + 1
f(2) = 0 + 1 + 2
f(3) = 0 + 1 + 2 + 3
...
f(n) = 0 + 1 + 2 + 3 + ... + n
具体から抽象へ
f(0) = 0
f(1) = f(0) + 1
f(2) = f(1) + 2
f(3) = f(2) + 3
...
f(n) = f(n - 1) + n
f(0) = 0
f(n) = f(n - 1) + n
def f(n: Int): Int =
if (n == 0) 0
else f(n - 1) + n
f(0) = 0
f(n) = f(n - 1) + n
問題
指定された自然数の階乗を返す関数
を定義せよ
階乗
f(0) = 1
f(1) = 1
f(2) = 2 * 1
f(3) = 3 * 2 * 1
...
f(n) = n * ... * 3 * 2 * 1
階乗 (一般化)
f(0) = 1
f(1) = 1 * f(0)
f(2) = 2 * f(1)
f(3) = 3 * f(2)
...
f(n) = n * f(n - 1)
f(0) = 1
f(n) = n * f(n - 1)
def f(n: Int): Int =
if (n == 0) 1
else n * f(n - 1)
フィボナッチ数列の n 項目の値を返
す関数の定義は?
1, 1, 2, 3, 5, 8, 13, …
フィボナッチ数
f(0) = 1
f(1) = 1
f(2) = 1 + 1
f(3) = 1 + 2
f(4) = 2 + 3
f(5) = 3 + 5
...
フィボナッチ数
f(0) = 1
f(1) = 1
f(2) = f(0) + f(1)
f(3) = f(1) + f(2)
f(4) = f(2) + f(3)
f(5) = f(3) + f(4)
...
f(n) = f(n - 2) + f(n - 1)
f(0) = 1
f(1) = 1
f(n) = f(n - 2) + f(n - 1)
def f(n: Int): Int =
if (n == 0) 1
else if (n == 1) 1
else f(n - 2) + f(n - 1)
問題
指定されたリスト内の数の合計を返す
関数 sum を定義せよ
def sum(ints: List[Int]): Int
リストの定義
•空リスト Nil はリスト
•head が要素、tail がリストなら
head :: tail もリスト
3
Nil
Nil::
3 :: Nil2 ::
2 :: 3 :: Nil1 ::
自身を使って定義されたデータ型
•再帰的なデータ型
•自己参照をするデータ型
例示
sum(5 :: 1 :: 2 :: 8 :: Nil)
= 5 + 1 + 2 + 8 + 0
sum(Nil) = 0
sum(8 :: Nil) = 8 + 0
sum(2 :: 8 :: Nil) = 2 + 8 + 0
sum(1 :: 2 :: 8 :: Nil) = 1 + 2 + 8 + 0
sum(5 :: 1 :: 2 :: 8 :: Nil) = 5 + 1 + 2 + 8 + 0
一般化
sum(Nil) = 0
sum(8 :: Nil) = 8 + sum(Nil)
sum(2 :: 8 :: Nil) = 2 + sum(8 :: Nil)
sum(1 :: 2 :: 8 :: Nil) = 1 + sum(2 :: 8 :: Nil)
sum(5 :: 1 :: 2 :: 8 :: Nil)

= 5 + sum(1 :: 2 :: 8 :: Nil)
一般化
sum(Nil) = 0
sum(8 :: Nil) = 8 + sum(Nil)
sum(2 :: 8 :: Nil) = 2 + sum(8 :: Nil)
sum(Nil) = 0
sum(head :: tail) = head + sum(tail)
head tail
head tail
sum(Nil) = 0
head + sum(tail)
def sum(list: List[Int]): Int =
if (list.isEmpty) 0
else list.head + sum(list.tail)
def sum(list: List[Int]): Int = list match {
case Nil => 0
case head :: tail => head + sum(tail)
}
def sum(list: List[Int]): Int = list match {
case Nil => 0
case head :: tail => head + sum(tail)
}
def sum(list: List[Int]): Int = {
def loop(acc: Int, l: List[Int]): Int = l match {
case Nil => acc
case head :: tail => loop(acc + head, tail)
}
loop(0, list)
}
問題
指定されたリスト内の数を掛け合わせ
た値を返す関数 product を定義せよ
def product(ints: List[Int]): Int
問題
指定されたリスト内の最大値を返す関
数 max を定義せよ
def max(ints: List[Int]): Int
問題
指定されたリストを逆順に並び替えて
返す関数 reverse を定義せよ
def reverse(ints: List[Int]): List[Int]
問題
指定されたリストの長さを返す関数
length を定義せよ
def length(ints: List[Int]): Int
型にあわせて処理を行う
型が処理を導くという側面も
お薦めのリソース
• Functional Programming Principles in Scala

Scala の作者である Martin Odersky 教授によ
る関数プログラミングの講義

https://www.coursera.org/course/progfun
• プログラミングの基礎

言語は OCaml だが関数プログラミングの入門
書としては良書

http://www.amazon.co.jp/dp/4781911609
• Scala関数型デザイン&プログラミング ―
Scalazコントリビューターによる関数型徹底
ガイド

前の 2つよりも難易度は高い。

http://www.amazon.co.jp/dp/4844337769

More Related Content

Similar to 関数プログラミングことはじめ

命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ
Naoki Kitora
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
Ransui Iso
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
Ra Zon
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
Ra Zon
 
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと 12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
Haruka Ozaki
 
Lisp batton - Common LISP
Lisp batton - Common LISPLisp batton - Common LISP
Lisp batton - Common LISP
Masaomi CHIBA
 
Rあんなときこんなとき(tokyo r#12)
Rあんなときこんなとき(tokyo r#12)Rあんなときこんなとき(tokyo r#12)
Rあんなときこんなとき(tokyo r#12)
Shintaro Fukushima
 

Similar to 関数プログラミングことはじめ (20)

命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ
 
たのしい関数型
たのしい関数型たのしい関数型
たのしい関数型
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
 
関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
 
文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜
文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜
文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
 
Introduction of Python
Introduction of PythonIntroduction of Python
Introduction of Python
 
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと 12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
 
Lisp batton - Common LISP
Lisp batton - Common LISPLisp batton - Common LISP
Lisp batton - Common LISP
 
Matlab演習
Matlab演習 Matlab演習
Matlab演習
 
これからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツールこれからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツール
 
Rあんなときこんなとき(tokyo r#12)
Rあんなときこんなとき(tokyo r#12)Rあんなときこんなとき(tokyo r#12)
Rあんなときこんなとき(tokyo r#12)
 
関数型プログラミング入門 for Matlab ユーザー
関数型プログラミング入門 for Matlab ユーザー関数型プログラミング入門 for Matlab ユーザー
関数型プログラミング入門 for Matlab ユーザー
 
20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swift20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swift
 
Scalaによる型安全なエラーハンドリング
Scalaによる型安全なエラーハンドリングScalaによる型安全なエラーハンドリング
Scalaによる型安全なエラーハンドリング
 
F#のすすめ
F#のすすめF#のすすめ
F#のすすめ
 
TensorflowとKerasによる深層学習のプログラム実装実践講座
TensorflowとKerasによる深層学習のプログラム実装実践講座TensorflowとKerasによる深層学習のプログラム実装実践講座
TensorflowとKerasによる深層学習のプログラム実装実践講座
 

More from Naoki Kitora (7)

関数プログラミングことはじめ in 福岡
関数プログラミングことはじめ in 福岡関数プログラミングことはじめ in 福岡
関数プログラミングことはじめ in 福岡
 
関数プログラミングことはじめ revival
関数プログラミングことはじめ revival関数プログラミングことはじめ revival
関数プログラミングことはじめ revival
 
機械学習とデータ分析プロセス
機械学習とデータ分析プロセス機械学習とデータ分析プロセス
機械学習とデータ分析プロセス
 
Scala kansai summit-2016
Scala kansai summit-2016Scala kansai summit-2016
Scala kansai summit-2016
 
Developers summit 2016_kansai
Developers summit 2016_kansaiDevelopers summit 2016_kansai
Developers summit 2016_kansai
 
第2回関数型言語勉強会 大阪
第2回関数型言語勉強会 大阪第2回関数型言語勉強会 大阪
第2回関数型言語勉強会 大阪
 
第一回関数型言語勉強会 大阪
第一回関数型言語勉強会 大阪第一回関数型言語勉強会 大阪
第一回関数型言語勉強会 大阪
 

Recently uploaded

Recently uploaded (7)

業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 

関数プログラミングことはじめ