読者です 読者をやめる 読者になる 読者になる

mike-neckのブログ

JavaかJavaFXかJavaEE(なんかJava8が多め)

Scalaのimplicit parameterとHaskellのType class(雑)

Scalaのcatsというライブラリーのドキュメント読んでて、Haskellじゃんなんて思ってました。

Cats Documentation - Typeclasses

で、若干気になったことがありまして、Javaの立場でScalaのimplicit parameterを見ていて、なんか怪しげな感じのする関数だなーなどと思っていました(Java老害脳)。

ただ、Haskellを少し勉強していてから、Scalaのcatsライブラリーのドキュメントをみると、implicit parameterってtype classの要請のために実装する関数っぽいものじゃないのかなと思うようになりました(雑な理解)。

data Janken = Goo | Choki | Par

という型があったとして、これがEqインスタンスであるためには

instance Eq Janken where
    Goo == Goo = True
    Choki == Choki = True
    Par == Par = True
    _ == _ = False

Eqで求められる関数を定義すれば型JankenEqインスタンスとなります。

一方、catsに書いてあったサンプルコード

implicit val stringShow = new Show[String] {
  def show(s: String) = s
}

を定義することでStringShowインスタンスとして扱うことができるようになります。

Haskellをほんのすこしかじった僕にはcatsのコードを見て、「あーimplicit parameter」ってType classっぽいヤツを宣言するときに使うんだと、何かが氷解するような感覚を覚えました。

Java脳の時はimplicit parameterは強引に関数の型に適合させるためのグルーコードっぽい印象を抱いていたので、なんか理解の仕方がすこし変わったなと思うところです。


眠いから終わりだし、雑なまとめ。Scala使いにも、Haskellerにも参考になりません。

ちなみに…


【2015/05/28 10:36 追記】

implicit conversionではなくて、implicit parameterというのが適切という指摘を頂いたので、修正しました。