没有和类型

时间:2013-07-11 11:51:13

标签: scala typeclass implicit-conversion

我正在阅读“学习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:随意更改问题标题,我不确定'这个问题的名称'是什么

1 个答案:

答案 0 :(得分:2)

我的猜测是代码无法确定Option的类型,它只基于None(因此Option[Nothing])。尝试先键入None,这样您调用的代码会在将其传递给truthyIf之前了解更多信息。如果是String,那么我的建议就是声明:

val opt:Option[String] = None

一旦你的代码可以识别基础类型,我猜它会停止抱怨。