39
Implicit Implicit Scala (あいは bpstudy #49の補足) 水島 宏太 (@kmizu)

Implicit Implicit Scala

Embed Size (px)

Citation preview

Page 1: Implicit Implicit Scala

Implicit Implicit Scala

(あるいは bpstudy #49の補足)

水島 宏太

(@kmizu)

Page 2: Implicit Implicit Scala

自己紹介

Page 3: Implicit Implicit Scala

@kmizu http://twitter.com/kmizu

@ktmizushima (English) http://twitter.com/ktmizushima

id:kmizushima

http://d.hatena.ne.jp/kmizushima

Scala辻斬り ヒーラー

Page 4: Implicit Implicit Scala

今回説明すること

Page 5: Implicit Implicit Scala

implicit parameter/conversion

Page 6: Implicit Implicit Scala

この二つの関係

Page 7: Implicit Implicit Scala

に関する正しい理解

Page 8: Implicit Implicit Scala

implicit parameter入門は

Page 9: Implicit Implicit Scala

http://www.slideshare.net/kmizushima/implicit-explicit-scala

Page 10: Implicit Implicit Scala

参照してください

Page 11: Implicit Implicit Scala

とりあえず世間的(?)な認識

Page 12: Implicit Implicit Scala

(A). 区別が付かない。ごっちゃになっている

(B). implicit parameter重要。二つは別物

(C). なんか黒魔術っぽい

(A), (B) の方対象に説明

Page 13: Implicit Implicit Scala

implicit conversionの基本形(誤)

Page 14: Implicit Implicit Scala

implicit def aToB(a: A): B = ...

Page 15: Implicit Implicit Scala

implicit conversionの基本形(正)

Page 16: Implicit Implicit Scala

implicit val aToB: A => B = {a => ... }

implicit value aToB: A => Bを定義

Page 17: Implicit Implicit Scala

Why?

Page 18: Implicit Implicit Scala

Scala Language Specification (2.9.0)

7.3 Views(p.193) より引用

• Implicit parameters and methods can also

define implicit conversions called views.

• A view from type S to type T is defined by

an implicit value which has function type

S=>T or (=>S)=>T or by a method

convertible to a value of that type.

Page 19: Implicit Implicit Scala

implicit def ... でconversionを定義できるのは

method type: (A) B � function type: (A => B)

への変換が可能だと言語仕様で規定されているため

Page 20: Implicit Implicit Scala

基本形はあくまで

Page 21: Implicit Implicit Scala

implicit val aToB: A => B = {a => ... }

Page 22: Implicit Implicit Scala

何が言いたい?

Page 23: Implicit Implicit Scala

implicit conversion ⊂ implicit parameter

Page 24: Implicit Implicit Scala

implicit conversionは

Page 25: Implicit Implicit Scala

implicit parameterの枠組みの

中で定義されている

Page 26: Implicit Implicit Scala

implicit valueの中で

単に A => B 型

(or それに変換可能なメソッド型)

を持ったものがものが

implicit conversion

Page 27: Implicit Implicit Scala

Page 28: Implicit Implicit Scala

implicit val i2s: Int => String = _.toString

1234.substring(1) � "234"

Page 29: Implicit Implicit Scala

def getOrdered[A](a: A)(implicit f: A => Ordered[A]):

Ordered[A] = a // a � f(a) // implicit conversion is applied

getOrdered(100) � Ordered[Int]

Page 30: Implicit Implicit Scala

説明は以上

Page 31: Implicit Implicit Scala

ちょっとした応用例

Page 32: Implicit Implicit Scala

recursive implicit conversion

(parameter)

Page 33: Implicit Implicit Scala

class DepthCalculator[M[_]] {

implicit def to0[T](k: T): Int = 0

implicit def toN[T](k: M[T])(implicit f: T => Int) :Int =

f(null.asInstanceOf[T]) + 1

def depth[T](implicit fn: T => Int) = fn(null.asInstanceOf[T])

}

implicit val calculator = new DepthCalculator[Array]

import calculator._

println(depth[String]) � 0

println(depth[Array[String]]) � 1

println(depth[Array[Array[String]]]) � 2

println(depth[Array[Array[Array[String]]]]) � 3

Page 34: Implicit Implicit Scala

無限に展開が続く場合

Page 35: Implicit Implicit Scala

コンパイルエラー

Page 36: Implicit Implicit Scala

ご静聴?ありがとう

ございました

Page 37: Implicit Implicit Scala

通称コップ本 第二版 好評発売中

Scala 2.8対応+付録Scala 2.9記事(by @kmizu)

Page 38: Implicit Implicit Scala

宣伝(2)

Page 39: Implicit Implicit Scala

こんなキーワードにピンと来たら(ry

Cakeパターン, CONCEPTパターン, 限定継続

現場でのScala, Javaとの連携