所以我有以下方法在Seq
中包装一个类似Option
的对象。
def noneIfEmpty[S <% Seq[_]](seq: S): Option[S] = {
if (seq.isEmpty) None else Some(seq)
}
我希望能够使用此方法转换包含在Try
中的计算结果。假设我使用List[Int]
:
scala> val tryList = Try(List(1,2,3))
tryList: scala.util.Try[List[Int]] = Success(List(1, 2, 3))
我应该可以使用noneIfEmpty
将Try[List[Int]]
映射到Try[Option[List[Int]]]
。如果我使用匿名函数并将列表显式传递给noneIfEmpty
...
scala> tryList map (list => noneIfEmpty(list))
res1: scala.util.Try[Option[List[Int]]] = Success(Some(List(1, 2, 3)))
...但如果我尝试将noneIfEmpty
作为部分应用函数传递,则会中断。
scala> tryList map noneIfEmpty _
<console>:40: error: No implicit view available from S => Seq[_].
tryList map noneIfEmpty _
^
如果我将noneIfEmpty
缩小到只接受列表,它也可以正常工作:
scala> def noneIfEmptyList[A](list: List[A]): Option[List[A]] = noneIfEmpty(list)
noneIfEmptyList: [A](list: List[A])Option[List[A]]
scala> tryList map noneIfEmptyList _
res2: scala.util.Try[Option[List[Int]]] = Success(Some(List(1, 2, 3)))
这里发生了什么?是否有某种类型的擦除伏都教在工作或什么?
答案 0 :(得分:5)
问题是视图绑定是隐式参数的语法糖,所以你的方法确实是
def noneIfEmpty[S](seq: S)(implicit ev: S => Seq[_]): Option[S]
不幸的是,您无法部分应用采用隐式参数的方法,因为eta-expansion(即将方法转换为函数)的过程需要提前解决隐含。
最终,您的问题会缩短为this one。