Upload
kota-mizushima
View
2.203
Download
0
Embed Size (px)
Citation preview
Implicit Implicit Scala
(あるいは bpstudy #49の補足)
水島 宏太
(@kmizu)
自己紹介
@kmizu http://twitter.com/kmizu
@ktmizushima (English) http://twitter.com/ktmizushima
id:kmizushima
http://d.hatena.ne.jp/kmizushima
Scala辻斬り ヒーラー
今回説明すること
implicit parameter/conversion
この二つの関係
に関する正しい理解
implicit parameter入門は
http://www.slideshare.net/kmizushima/implicit-explicit-scala
参照してください
とりあえず世間的(?)な認識
(A). 区別が付かない。ごっちゃになっている
(B). implicit parameter重要。二つは別物
(C). なんか黒魔術っぽい
(A), (B) の方対象に説明
implicit conversionの基本形(誤)
implicit def aToB(a: A): B = ...
implicit conversionの基本形(正)
implicit val aToB: A => B = {a => ... }
implicit value aToB: A => Bを定義
Why?
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.
implicit def ... でconversionを定義できるのは
method type: (A) B � function type: (A => B)
への変換が可能だと言語仕様で規定されているため
基本形はあくまで
implicit val aToB: A => B = {a => ... }
何が言いたい?
implicit conversion ⊂ implicit parameter
implicit conversionは
implicit parameterの枠組みの
中で定義されている
implicit valueの中で
単に A => B 型
(or それに変換可能なメソッド型)
を持ったものがものが
implicit conversion
例
implicit val i2s: Int => String = _.toString
1234.substring(1) � "234"
def getOrdered[A](a: A)(implicit f: A => Ordered[A]):
Ordered[A] = a // a � f(a) // implicit conversion is applied
getOrdered(100) � Ordered[Int]
説明は以上
ちょっとした応用例
recursive implicit conversion
(parameter)
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
無限に展開が続く場合
コンパイルエラー
ご静聴?ありがとう
ございました
通称コップ本 第二版 好評発売中
Scala 2.8対応+付録Scala 2.9記事(by @kmizu)
宣伝(2)
こんなキーワードにピンと来たら(ry
Cakeパターン, CONCEPTパターン, 限定継続
現場でのScala, Javaとの連携