Skip to content

Instantly share code, notes, and snippets.

@aoiroaoino
Last active December 19, 2015 16:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aoiroaoino/5985889 to your computer and use it in GitHub Desktop.
Save aoiroaoino/5985889 to your computer and use it in GitHub Desktop.
途中
!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