1

「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:質問のタイトルを自由に変更してください。「この問題の名前」が何であるかはよくわかりません

4

1 に答える 1

2

ここでの私の推測では、コードはOptiona だけを取得することに基づいているの型を理解できないNone(したがってOption[Nothing]) ということです。Noneに渡す前に、呼び出しているコードがそれについて詳しく知ることができるように、最初に入力してみてくださいtruthyIf。の場合String、私の提案は次のように宣言することです。

val opt:Option[String] = None

コードが基になる型を識別できるようになると、文句を言わなくなると思います。

于 2013-07-11T12:20:34.837 に答える