我正在阅读“学习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的类型类,我们可以使用上面定义的类别[A]和(x:Option[A]).truthy
==的类型,当且仅当x != None
和{{1 }}
对于像这样的代码似乎工作正常:
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
任何想法如何解决这个问题以及为什么这不起作用?
要使用此代码,您可以克隆此repo:console>:29: error: could not find implicit value for evidence parameter of type CanTruthy[Option[Nothing]]
truthyIf(none)(y)(n) assert_=== n
(此代码位于src / scala / day1.scala中)
PS:随意更改问题标题,我不确定'这个问题的名称'是什么
答案 0 :(得分:2)
我的猜测是代码无法确定Option
的类型,它只基于None
(因此Option[Nothing]
)。尝试先键入None
,这样您调用的代码会在将其传递给truthyIf
之前了解更多信息。如果是String
,那么我的建议就是声明:
val opt:Option[String] = None
一旦你的代码可以识别基础类型,我猜它会停止抱怨。