SlideShare a Scribd company logo
Scalaのimplicit、カリー化、複数の引数リストについて
Implicitとは
 implicitとは「暗黙的な」という意味です。
 implicitはむやみに使うのは危険です。
 上手く使いこなせれば,とても美しいコードが書けるようになります。
現に,Scalaの標準ライブラリやPlayFrameworkではしばしばこの
implicitが使われています。
3つのimplicitの使い方
 暗黙の型変換(implicit conversions)
 既存の型を拡張する(implicit class)
 暗黙の引数(implicit parameter)
暗黙の型変換(IMPLICIT CONVERSIONS)
 コンパイル時に変換できる関数があるかを探して,勝手にやってくれ
ます。
object Main {
implicit def floatToInt(f: Float): Int = f.toInt
def logInt(i: Int) = println(i)
def test() = {
logInt(1)
logInt(0.2f)
}
}
既存の型を拡張する(IMPLICIT CLASS)
 あるオブジェクトメソッドが実装されていない場合,それを変換でき
るimplicit関数があれば,それで変換する。
object Main {
implicit class A(a: Int) {
def b = a * 10
}
}
暗黙の引数 (IMPLICIT PARAMETERS)
 implicitな引数に具体的な値を渡さなかった場合,コンパイラはimplicit
が付いている値・関数から型の合うものを探し,渡してくれる。
 Scala公式ではこの使い方を推奨している
object Main {
implicit val default = 10
def test(a: Short)(implicit b: Int, c: Int): Int = a + b * c
}
暗黙の引数でできないこと
 複数の引数リストをとる関数の最後尾の引数リスト以外に暗黙の引数
は適用できない。
 呼び出した関数で適用した暗黙の引数の型の implicit val 定義がスコー
プ内になければエラーになる。
 呼び出した関数で適用した暗黙の引数の型の implicit val 定義がスコー
プ内で2つ以上ある場合エラーになる。
カリー化
カリー化
 複数の引数を取る関数を、1つの引数を取る関数のチェーンに変換する
ことらしい
 部分適用とは別物
複数の引数を取る関数
val add = {(x:Int, y:Int, z:Int) => x + y + z}
curriedメソッドでカリー化
val addCurried = add.curried
カリー化
 結果として
val addCurriedWithX = addCurried(1)
val addCurriedWithXY = addCurriedWithX(2)
addCurriedWithXY(3)
ちなみに
addCurried(1)(2)(3)
もできます
カリー化
 要するに
val addCurried
↓
def addCurried(x:Int)(y:Int)(z:Int) = x + y + z
Scalaではこっちのほうが一般的らしい
複数の引数リスト
 複数の引数リストとカリー化の違いが判りませんでした。。。
ちなみに
部分適用
 部分適用とは複数の引数を取る関数に対して、一部の引数に値を束縛
した関数を返すことらしい
def add(x: Int, y: Int, z: Int):Int = x + y + z
val addWithXY = add(_: Int, _: Int, z = 3)
まとめ
まとめ
 implicitもカリー化も正しく使えれば便利そうだな
 Implicitを使う上でカリー化は必須

More Related Content

PDF
こわくないScala
PDF
Scala is-unscared
PDF
夏だからJava再入門
PDF
Effective Modern C++ 勉強会 Item26
PDF
Javaクラスファイルの読み方
PDF
Hokuriku Scala 1
PDF
rpscala35-scala2.9.0
PPTX
Kotlinについて学んだコト
こわくないScala
Scala is-unscared
夏だからJava再入門
Effective Modern C++ 勉強会 Item26
Javaクラスファイルの読み方
Hokuriku Scala 1
rpscala35-scala2.9.0
Kotlinについて学んだコト

What's hot (10)

PDF
Scalaノススメ
PDF
Laravel shibuya 3 Laravel Beginner IRT
PDF
Chapter5.3
PPTX
2歩目 プレゼン資料 初歩から始めるjava勉強会
PPTX
Gcflt会2017/4/2
PPTX
final int をFINAL しやがれ!
PPT
プログラミングの基礎振り返りスライド1
PDF
Phantom Type in Scala
PPT
Rpscala2011 0601
ODP
Haskellの型安全性の力よ〜参照透明性編〜
Scalaノススメ
Laravel shibuya 3 Laravel Beginner IRT
Chapter5.3
2歩目 プレゼン資料 初歩から始めるjava勉強会
Gcflt会2017/4/2
final int をFINAL しやがれ!
プログラミングの基礎振り返りスライド1
Phantom Type in Scala
Rpscala2011 0601
Haskellの型安全性の力よ〜参照透明性編〜
Ad

Similar to Scalaのimplicit、カリー化 (20)

PDF
第一回社内 Scala 勉強会(一部抜粋)
PDF
Scalaで型クラス入門
PDF
Essential Scala 第5章 シーケンス処理
PDF
第一回社内 Scala 勉強会(一部抜粋)その 2
PDF
ATN No.2 Scala事始め
PPT
Scala Daysに行ってみて
ODP
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
PDF
Scalaで萌える関数型プログラミング[完全版]
PPTX
関数型言語&形式的手法セミナー(3)
PDF
Scala の関数型プログラミングを支える技術
PDF
Scalaで萌える関数型プログラミング[1.1.RC1]
KEY
Beginners Scala in FAN 20121009
PDF
MoteMote Compiler Plugin
PDF
ラムダと invokedynamic の蜜月
PDF
Scala2.8への移行
PDF
Scala2.8への移行
PPTX
ラムダのコンパイル結果を5分で説明するよ​
PPTX
Java8勉強会
PDF
安全なプログラムの作り方
PDF
Lisp Tutorial for Pythonista Day 6
第一回社内 Scala 勉強会(一部抜粋)
Scalaで型クラス入門
Essential Scala 第5章 シーケンス処理
第一回社内 Scala 勉強会(一部抜粋)その 2
ATN No.2 Scala事始め
Scala Daysに行ってみて
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
Scalaで萌える関数型プログラミング[完全版]
関数型言語&形式的手法セミナー(3)
Scala の関数型プログラミングを支える技術
Scalaで萌える関数型プログラミング[1.1.RC1]
Beginners Scala in FAN 20121009
MoteMote Compiler Plugin
ラムダと invokedynamic の蜜月
Scala2.8への移行
Scala2.8への移行
ラムダのコンパイル結果を5分で説明するよ​
Java8勉強会
安全なプログラムの作り方
Lisp Tutorial for Pythonista Day 6
Ad

Scalaのimplicit、カリー化