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
で求められる関数を定義すれば型Janken
はEq
のインスタンスとなります。
一方、catsに書いてあったサンプルコード
implicit val stringShow = new Show[String] { def show(s: String) = s }
を定義することでString
がShow
のインスタンスとして扱うことができるようになります。
Haskellをほんのすこしかじった僕にはcatsのコードを見て、「あーimplicit parameter」ってType classっぽいヤツを宣言するときに使うんだと、何かが氷解するような感覚を覚えました。
Java脳の時はimplicit parameterは強引に関数の型に適合させるためのグルーコードっぽい印象を抱いていたので、なんか理解の仕方がすこし変わったなと思うところです。
眠いから終わりだし、雑なまとめ。Scala使いにも、Haskellerにも参考になりません。
ちなみに…
Scalaを書く練習のためにHaskell勉強している僕はどうすれば…
— 持田真哉 (@mike_neck) May 26, 2015
【2015/05/28 10:36 追記】
implicit conversionではなくて、implicit parameterというのが適切という指摘を頂いたので、修正しました。
@mike_neck implicit conversionより、implicit valueかimplicit parameterという語を使う方が適切かもしれません。
— ねこはる (@halcat0x15a) 2015, 5月 27