我正在阅读“学习scalaz”博客系列(这部分:http ://eed3si9n.com/learning-scalaz/a+Yes-No+typeclass.html ),我正在尝试为Option实现truthy类。
这是我想出的类型类,非常简单:
implicit def optionCanTruthy[A: CanTruthy]: CanTruthy[Option[A]] = CanTruthy.truthys({
case None => false
case Some(x) => x.truthy
})
这个想法是,如果我们有 A 的类型类,我们可以将上面定义的类型类用于 Option[A] 和 for (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
任何想法如何解决这个问题,为什么这不起作用?
要使用此代码,您可以克隆此 repo:(git@github.com:tomasherman/scalaz.git
此代码位于 src/scala/day1.scala 中)
PS:随意更改问题标题,我不确定“这个问题的名称”是什么