「learning scalaz」ブログ シリーズ (この部分: http://eed3si9n.com/learning-scalaz/a+Yes-No+typeclass.html ) を読んでいて、Option の真のクラスを実装しようとしています。
これが私が思いついた型クラスです。かなり簡単です:
implicit def optionCanTruthy[A: CanTruthy]: CanTruthy[Option[A]] = CanTruthy.truthys({
case None => false
case Some(x) => x.truthy
})
アイデアは、A の型クラスがある場合、上で定義した型クラスを Option[A] と(x:Option[A]).truthy
== true の場合にx != None
使用できるということです。x.get.truthy == true
次のようなコードでは問題なく動作するようです。
1.some.truthy assert_=== true
0.some.truthy assert_=== false
none.truthy assert_=== false
しかし、次のメソッドを定義しようとすると:
def truthyIf[A: CanTruthy](cond: A)(ifyes: => String)(ifno: => String): String = {
if(cond.truthy) { ifyes } else { ifno }
}
cond
引数 == None の場合、次のコンパイル エラーで爆発します。
console>:29: error: could not find implicit value for evidence parameter of type CanTruthy[Option[Nothing]]
truthyIf(none)(y)(n) assert_=== n
これを修正する方法と、なぜこれが機能しないのですか?
このコードをいじるには、このレポをクローンできます: git@github.com:tomasherman/scalaz.git
(このコードは src/scala/day1.scala にあります)
PS:質問のタイトルを自由に変更してください。「この問題の名前」が何であるかはよくわかりません