scalaで学ぶ関数型超入門

92
Scala で学ぶ関数型言語超入門 ~ 関数型言語の魅力 ~

Upload: yuichiro-takahashi

Post on 02-Jul-2015

513 views

Category:

Engineering


3 download

DESCRIPTION

学内発表会スライド

TRANSCRIPT

Page 1: Scalaで学ぶ関数型超入門

Scalaで学ぶ関数型言語超入門~関数型言語の魅力~

Page 2: Scalaで学ぶ関数型超入門

はじめに素数アルゴリズムで見るオブジェクト指向言語との違い

Page 3: Scalaで学ぶ関数型超入門

エラトステネスのふるい?

Page 4: Scalaで学ぶ関数型超入門

エラトステネスのふるい?• 素数を求めるときに使うアルゴリズム

Page 5: Scalaで学ぶ関数型超入門

エラトステネスのふるい?• 素数を求めるときに使うアルゴリズム

• プログラミングの問題なんかによく出てくる

Page 6: Scalaで学ぶ関数型超入門

エラトステネスのふるい?• 素数を求めるときに使うアルゴリズム

• プログラミングの問題なんかによく出てくる

• 古代ギリシャの数学者であるエラトステネスが考案したのでこう呼ばれている

←エラトステネス

Page 7: Scalaで学ぶ関数型超入門

内容

Page 8: Scalaで学ぶ関数型超入門

内容• 整数のリストに2からxまでの数字を入れます

Page 9: Scalaで学ぶ関数型超入門

内容• 整数のリストに2からxまでの数字を入れます

• リストの先頭に行き、その数の倍数を振り落とす

Page 10: Scalaで学ぶ関数型超入門

内容• 整数のリストに2からxまでの数字を入れます

• リストの先頭に行き、その数の倍数を振り落とす

• リストの先頭の値がxの平方根になるまで繰り返す

Page 11: Scalaで学ぶ関数型超入門

このように余計な数字を順番に振り落としていくわけです!

Page 12: Scalaで学ぶ関数型超入門

人間社会によく似ていますね!

Page 13: Scalaで学ぶ関数型超入門

では早速コードを見てみましょう!

Page 14: Scalaで学ぶ関数型超入門

Javaの実装例

Page 15: Scalaで学ぶ関数型超入門

少しごちゃごちゃしていますね・・・

Oh no!

Page 16: Scalaで学ぶ関数型超入門

ではこれをScalaで書くと?

Page 17: Scalaで学ぶ関数型超入門

ではこれをScalaで書くと?

Page 18: Scalaで学ぶ関数型超入門

Scalaの実装例

Page 19: Scalaで学ぶ関数型超入門

たったこれだけ!?

Page 20: Scalaで学ぶ関数型超入門

比較Java Scala

Page 21: Scalaで学ぶ関数型超入門

すばらしい!

Page 22: Scalaで学ぶ関数型超入門

なぜこんな簡潔に短く書けるのか気になりませんか?

空気読んで!

Page 23: Scalaで学ぶ関数型超入門

もちろん気になりますよね?

Page 24: Scalaで学ぶ関数型超入門

それではご説明致しましょう! 関数型の世界へようこそ!

Page 25: Scalaで学ぶ関数型超入門

関数型言語について~関数型言語の種類や利点、特徴~

Page 26: Scalaで学ぶ関数型超入門

そもそも”関数型言語”ってなんぞや?

Page 27: Scalaで学ぶ関数型超入門

関数型言語とは!

関数型プログラミングに向いた特徴を持つ

プログラミング言語で、引数に関数を作用させて

計算を行う事から作用型言語とも言われる!

(Wikipediaより抜粋)

Page 28: Scalaで学ぶ関数型超入門

は?(^q^)

Page 29: Scalaで学ぶ関数型超入門

どういうこと?

Page 30: Scalaで学ぶ関数型超入門

関数型言語の特徴

Page 31: Scalaで学ぶ関数型超入門

関数型言語の特徴• 基本的に一度変数に値を入れると変更できない(イミュータブルな変数)

Page 32: Scalaで学ぶ関数型超入門

関数型言語の特徴• 基本的に一度変数に値を入れると変更できない(イミュータブルな変数)

• 関数がファーストクラスオブジェクトである

Page 33: Scalaで学ぶ関数型超入門

関数型言語の特徴• 基本的に一度変数に値を入れると変更できない(イミュータブルな変数)

• 関数がファーストクラスオブジェクトである

• 高階関数

Page 34: Scalaで学ぶ関数型超入門

関数型言語の特徴• 基本的に一度変数に値を入れると変更できない(イミュータブルな変数)

• 関数がファーストクラスオブジェクトである

• 高階関数

• 関数の部分適用、カリー化

Page 35: Scalaで学ぶ関数型超入門

関数型言語の特徴• 基本的に一度変数に値を入れると変更できない(イミュータブルな変数)

• 関数がファーストクラスオブジェクトである

• 高階関数

• 関数の部分適用、カリー化

• 遅延評価

Page 36: Scalaで学ぶ関数型超入門

関数型言語の特徴• 基本的に一度変数に値を入れると変更できない(イミュータブルな変数)

• 関数がファーストクラスオブジェクトである

• 高階関数

• 関数の部分適用、カリー化

• 遅延評価

• Option型

Page 37: Scalaで学ぶ関数型超入門

関数型言語の特徴• 基本的に一度変数に値を入れると変更できない(イミュータブルな変数)

• 関数がファーストクラスオブジェクトである

• 高階関数

• 関数の部分適用、カリー化

• 遅延評価

• Option型

• 再帰

Page 38: Scalaで学ぶ関数型超入門

関数型言語の特徴• 基本的に一度変数に値を入れると変更できない(イミュータブルな変数)

• 関数がファーストクラスオブジェクトである

• 高階関数

• 関数の部分適用、カリー化

• 遅延評価

• Option型

• 再帰

• 型推論

Page 39: Scalaで学ぶ関数型超入門

関数型言語ってどんなんがあんの?

Page 40: Scalaで学ぶ関数型超入門

代表的な関数型言語

Page 41: Scalaで学ぶ関数型超入門

代表的な関数型言語• 純粋関数型言語

Page 42: Scalaで学ぶ関数型超入門

代表的な関数型言語• 純粋関数型言語

• Haskell • Miranda

Page 43: Scalaで学ぶ関数型超入門

代表的な関数型言語• 純粋関数型言語

• Haskell • Miranda

• 非純粋関数型言語

Page 44: Scalaで学ぶ関数型超入門

代表的な関数型言語• 純粋関数型言語

• Haskell • Miranda

• 非純粋関数型言語

• ML • Scala • OCaml • Erlang • Swift

Page 45: Scalaで学ぶ関数型超入門

じゃあ関数型言語を使うと何が嬉しいの?

Page 46: Scalaで学ぶ関数型超入門

関数型言語のメリットその1

実行時エラーが圧倒的に少ない

Page 47: Scalaで学ぶ関数型超入門

実行時エラーが少ない

Page 48: Scalaで学ぶ関数型超入門

実行時エラーが少ない• 基本的にコンパイル時にほとんどのエラーを検出してくれる

Page 49: Scalaで学ぶ関数型超入門

実行時エラーが少ない• 基本的にコンパイル時にほとんどのエラーを検出してくれる

• Option型の使用によりぬるぽで落ちることはほとんどない!(多少意識してコーディングする必要はある)

Page 50: Scalaで学ぶ関数型超入門

実行時エラーが少ない• 基本的にコンパイル時にほとんどのエラーを検出してくれる

• Option型の使用によりぬるぽで落ちることはほとんどない!(多少意識してコーディングする必要はある)

• 値が変更不可能、また関数が細かいのでバグが発見しやすい

Page 51: Scalaで学ぶ関数型超入門

関数型言語のメリットその2

コードが短くシンプルになる

Page 52: Scalaで学ぶ関数型超入門

コードが短くシンプルになる

Page 53: Scalaで学ぶ関数型超入門

コードが短くシンプルになる• 関数を処理毎に細かく分けそれをつなげたり合成したりしてプログラミングしていくので、コードが短くて済む

Page 54: Scalaで学ぶ関数型超入門

コードが短くシンプルになる• 関数を処理毎に細かく分けそれをつなげたり合成したりしてプログラミングしていくので、コードが短くて済む

• 上で説明したように大きな関数も細かい関数から成り立っているので、いくつか関数を理解すれば他の関数もスッと理解していく事ができる

Page 55: Scalaで学ぶ関数型超入門

関数型言語のメイン、関数について~関数と高階関数~

Page 56: Scalaで学ぶ関数型超入門

関数の特徴

Page 57: Scalaで学ぶ関数型超入門

関数の特徴• 同じ入力に対して必ず同じ出力を返す(原則)

Page 58: Scalaで学ぶ関数型超入門

関数の特徴• 同じ入力に対して必ず同じ出力を返す(原則)

• 関数は変数と同じく引数や戻り値にもできる(ファーストクラスオブジェクト) ←重要!

Page 59: Scalaで学ぶ関数型超入門

関数の特徴• 同じ入力に対して必ず同じ出力を返す(原則)

• 関数は変数と同じく引数や戻り値にもできる(ファーストクラスオブジェクト)

• また、変数に格納する事も関数同士を組み合わせて新しい関数を作る事も可能

Page 60: Scalaで学ぶ関数型超入門

Java(笑)などのオブジェクト指向言語のメソッドに比べて柔軟性が高い!

という事です!

Page 61: Scalaで学ぶ関数型超入門

じゃあ高階関数って?

後悔→

Page 62: Scalaで学ぶ関数型超入門

高階関数とは!

Page 63: Scalaで学ぶ関数型超入門

高階関数とは!• 引数に関数を取ったり、戻り値として関数を返す関数のこと

Page 64: Scalaで学ぶ関数型超入門

高階関数とは!• 引数に関数を取ったり、戻り値として関数を返す関数のこと

• List(配列みたいなもん)を操作するmap、filter、foreachなどが有名

Page 65: Scalaで学ぶ関数型超入門

今回はmapをご紹介したいと思います!

Page 66: Scalaで学ぶ関数型超入門

map関数とは!

Page 67: Scalaで学ぶ関数型超入門

map関数とは!• mapとは

“配列の中身を引数に取り(A型とします)B型を返す関数”

を引数に取りB型のコレクションを返す高階関数です

Page 68: Scalaで学ぶ関数型超入門

map関数とは!• mapとは

“配列の中身を引数に取り(A型とします)B型を返す関数”

を引数に取りB型のコレクションを返す高階関数です • 引数として与えられた関数を配列の要素一つ一つに適用

していきます

Page 69: Scalaで学ぶ関数型超入門

つまり・・・

Page 70: Scalaで学ぶ関数型超入門

“配列の中身を何かしら変化させる関数” という事ですね!

Page 71: Scalaで学ぶ関数型超入門

ではmapを使って配列の中身を全て2倍にして出力してみます!

(配列の中身を)

Page 72: Scalaで学ぶ関数型超入門

mapを使って配列の中身を2倍に

Page 73: Scalaで学ぶ関数型超入門

なんだかよくわかりませんね! (^q^)

Page 74: Scalaで学ぶ関数型超入門

解説!

Page 75: Scalaで学ぶ関数型超入門

解説!• mapの中にある (v: Int) => v * 2 というのが引数として与えられている関数です

Page 76: Scalaで学ぶ関数型超入門

解説!• mapの中にある (v: Int) => v * 2 というのが引数として与えられている関数です

• この関数は数値を一つ引数に取り、その数値を2倍にして返します

Page 77: Scalaで学ぶ関数型超入門

図解map関数

Page 78: Scalaで学ぶ関数型超入門

は?(威圧)

Page 79: Scalaで学ぶ関数型超入門

returnが無いのになんで戻り値があんの?

Page 80: Scalaで学ぶ関数型超入門

returnについて

Page 81: Scalaで学ぶ関数型超入門

returnについて• Scalaをはじめとする関数型言語では関数の戻り値は

 ”関数の中で最後に評価(実行)された値”となるので

return文は基本的に必要ないのです!

Page 82: Scalaで学ぶ関数型超入門

returnについて• Scalaをはじめとする関数型言語では関数の戻り値は

 ”関数の中で最後に評価(実行)された値”となるので

return文は基本的に必要ないのです!  • なので今回の場合は v * 2 がそのまま戻り値となります

Page 83: Scalaで学ぶ関数型超入門

まとめ

Page 84: Scalaで学ぶ関数型超入門

まとめ• 関数型言語は小さな関数を組み合わせてプログラムを作りあげていく!

Page 85: Scalaで学ぶ関数型超入門

まとめ• 関数型言語は小さな関数を組み合わせてプログラムを作りあげていく!

• 関数の柔軟性が高いので複雑な処理もシンプルに書ける!

Page 86: Scalaで学ぶ関数型超入門

まとめ• 関数型言語は小さな関数を組み合わせてプログラムを作りあげていく!

• 関数の柔軟性が高いので複雑な処理もシンプルに書ける!

• コードの記述量が減る!

Page 87: Scalaで学ぶ関数型超入門

まとめ• 関数型言語は小さな関数を組み合わせてプログラムを作りあげていく!

• 関数の柔軟性が高いので複雑な処理もシンプルに書ける!

• コードの記述量が減る!

• 実行時エラーがほとんどない!

Page 88: Scalaで学ぶ関数型超入門

まとめ• 関数型言語は小さな関数を組み合わせてプログラムを作りあげていく!

• 関数の柔軟性が高いので複雑な処理もシンプルに書ける!

• コードの記述量が減る!

• 実行時エラーがほとんどない!

• 読みやすい!

Page 89: Scalaで学ぶ関数型超入門

まとめ• 関数型言語は小さな関数を組み合わせてプログラムを作りあげていく!

• 関数の柔軟性が高いので複雑な処理もシンプルに書ける!

• コードの記述量が減る!

• 実行時エラーがほとんどない!

• 読みやすい!

• 高階関数(というか考え方)はとても大事!

Page 90: Scalaで学ぶ関数型超入門

まとめ2

関数型言語(とくにScala)最高! (☝ ՞ਊ ՞)☝フウウウゥゥゥ!!!wwwwww

Page 91: Scalaで学ぶ関数型超入門

これを期にぜひ関数型言語を触ってみてください!

Page 92: Scalaで学ぶ関数型超入門

ご清聴ありがとうございました!