Implicit Implicit Scala

Preview:

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との連携

Recommended