我正在尝试编写一个通用方法,它将任何具有scalaz.IsEmpty
typeclass 实例的内容包装到Option
. 它应该返回空值,如果它是非空的,则将其None
包装进去。Some
这是我到目前为止提出的:
import scalaz._
import Scalaz._
def asOption0[C](c: C)(implicit ev: IsEmpty[({ type B[A] = C })#B]) =
if (ev.isEmpty(c)) None else Some(c)
def asOption1[A, C[_]](c: C[A])(implicit ev: IsEmpty[C]) =
if (ev.isEmpty(c)) None else Some(c)
asOption0
适用于原始类型,例如String
(通过使用类型 lambda来指示C
具有 shape B[_]
)并asOption1
适用于具有一元类型构造函数的类型,例如List
:
scala> asOption0("")
res1: Option[String] = None
scala> asOption1(List(1,2,3))
res0: Option[List[Int]] = Some(List(1, 2, 3))
scala> asOption0(List(1,2,3))
<console>:17: error: could not find implicit value for parameter
ev: scalaz.IsEmpty[[A]List[Int]]
scala> asOption1("hello")
<console>:17: error: could not find implicit value for parameter
ev: scalaz.IsEmpty[Comparable]
是否可以同时编写一种适用于String
、List
和 更高类型的方法?