Last active
December 19, 2015 16:39
-
-
Save aoiroaoino/5985889 to your computer and use it in GitHub Desktop.
途中
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
!SLIDE | |
## 第三回社内Scala勉強会 | |
!SLIDE | |
(個人的には第一回ですけど...) | |
!SLIDE | |
## 第一回社内Scala勉強会 | |
!SLIDE | |
## 今回はゆるふわでいくよー☆(空前のマイブーム | |
!SLIDE | |
今回は高階関数型等々について簡単に。 | |
主にコードはコップ本参考。 | |
!SLIDE | |
30分程度の簡単な弾丸ツアーです! | |
!SLIDE | |
## 目次 | |
* 高階関数のイメージ | |
* 無名関数のイメージ | |
* map, filter, foreach | |
* ちょっと演習 | |
* 次回予告 | |
!SLIDE | |
## 目次 | |
* 高階関数のイメージ | |
* 無名関数のイメージ | |
* <s>map, filter, foreach</s> | |
* <s>ちょっと演習</s> | |
* 次回予告 | |
!SLIDE | |
## 高階関数のイメージ | |
!SLIDE | |
高階関数ってなに? | |
!SLIDE | |
高階関数は厳密には第一級関数をサポートしているプログラミング言語において定義されるため、一般にリフレクションなしではプログラムの実行時に動的に生成することができないCのような関数ポインタをサポートしている言語は第一級関数をサポートしているとは見なされていない。 | |
高階関数は関数を引数にしたり、あるいは関数を戻り値とするものであり、引数や戻り値の関数もまた高階関数となり得る。高階関数は主に関数型言語やその背景理論であるラムダ計算において多用される。 | |
また、ある関数(手続き)の引数となる関数(手続き)のことを関数引数(英: Functional argument/parameter)や手続き引数(英: Procedural argument/parameter)と呼ぶこともある。※wikipediaより引用 | |
!SLIDE | |
_人人人人人人人_ | |
> 突然の引用 < | |
 ̄Y^Y^Y^Y^Y^Y ̄ | |
!SLIDE | |
_人人人人人人人人人_ | |
> よくわからない < | |
 ̄Y^Y^Y^Y^Y^Y^Y^Y ̄ | |
!SLIDE | |
例えば... | |
!SLIDE | |
Javaで変数に代入できるものってなーんだ? | |
* プリミティブな値 | |
```java | |
Int num = 100 | |
``` | |
* オブジェクト | |
```java | |
Huga huga = new Huga() | |
``` | |
!SLIDE | |
.....あれ?メソッドは? | |
!SLIDE | |
オブジェクト指向って | |
「"処理"は、対象となる"データ"に結びついていなければならない」 | |
って言い換えられません? | |
!SLIDE | |
(もちろん例外多数ありますけどね、Rubyとか) | |
!SLIDE | |
この制約によってコードの重複が生まれる | |
例えば... | |
```java | |
public Int add(Int n, Int m) { | |
return n + m; | |
} | |
public Int sum(Int n, Int m) { | |
return n - m; | |
} | |
``` | |
"+" と "-" の違いしかないじゃん! | |
!SLIDE | |
ちょっと話を戻します。 | |
そもそも高階関数ってなに? | |
!SLIDE | |
「"処理"を値として扱うこと」 | |
!SLIDE | |
ドヤァ | |
!SLIDE | |
具体例1 | |
```scala | |
def calc(n: Int, m: Int, op: (Int, Int) => Int) = op(n, m) | |
val plus = (n: Int, m: Int) => n + m | |
val minus = (n: Int, M: Int) => n - m | |
calc(1, 1, plus) //=> 2 | |
calc(1, 1, minus) //=> 0 | |
``` | |
!SLIDE | |
具体例2 | |
※コップ本P参照 | |
!SLIDE | |
## すごくないですか!? | |
!SLIDE | |
高階関数が本質的にどういうものか、使えるとどんなメリットがあるかわかって頂けただろうか... | |
!SLIDE | |
## 無名関数のイメージ | |
!SLIDE | |
お気づきの方もいるかもしれませんが.... | |
!SLIDE | |
はっきり言って... | |
!SLIDE | |
具体例1は煩雑です!!! | |
!SLIDE | |
無名関数(と、Scalaで許される省略記法)を用いて | |
```scala | |
calc(1, 1, _ + _) //=> 2 | |
calc(1, 1, _ - _) //=> 0 | |
``` | |
と表現出来ます。 | |
!SLIDE | |
処理をより抽象的に扱うことで、コードの重複を避けたり、新たな制御構文を作り易くなる。 | |
!SLIDE | |
注意: "_"を使った記法は、型推論によって型が解決出来る場合にのみ使えます。 | |
今回は、calcの引数に型宣言が書いてあるため、型推論出来た。 | |
!SLIDE | |
"_"については....(資料間に合わなかったorz) | |
!SLIDE | |
あと、ついでにイメージといいつつScalaではどのように実現されてるのか実装を見てみましょう。 | |
!SLIDE | |
Scalaにおける無名関数はclass FunctionNのに対する糖衣構文でしかありません!! | |
!SLIDE | |
```scala | |
// 右側は「(Int, Int) => Int」型 | |
val sum = (n: Int, m: Int): Int => n + m | |
// Function2[Int, Int, Int]のインスタンスとして処理される | |
val sum = new Function2[Int, Int, Int] { | |
def apply(n: Int, m: Int): Int = n + m | |
} | |
``` | |
※applyメソッドは、インスタンス生成時に呼ばれる特別なメソッド | |
!SLIDE | |
Scalaの関数は、(特別な)クラスのインスタンスだった! | |
!SLIDE | |
以上です。お疲れさまでした! | |
!SLIDE | |
次回予 | |
告 | |
!SLIDE | |
_人人人人人_ | |
> 未 定 < | |
 ̄Y^Y^Y^Y^ ̄ | |
!SLIDE | |
だったけど、今日の残りを埋めてきます... |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment