2012-08-04 31 views
13

的集合映射函数接受序列[字符]我可以定义一个接受Seq[Char]斯卡拉:我为什么不能在字符串

def f(s: Seq[Char]) = s 

函数,如果我通过在String它的工作原理:

scala> f("this") 
res8: Seq[Char] = this 

这意味着我可以在map使用它:

scala> List("this").map(s => f(s)) 
res9: List[Seq[Char]] = List(this) 

那么,为什么我不能做到这一点?:

scala> List("this").map(f) 
<console>:10: error: type mismatch; 
found : Seq[Char] => Seq[Char] 
required: java.lang.String => ? 
       List("this").map(f) 
          ^

回答

11

你不能这样做,因为没有推广的隐式转换A => BF[A] => F[B]的。特别是,f实际上是Seq[Char] => Seq[Char]类型的一个实例,您需要从String => Seq[Char]进行隐式转换才能生成函数String => Seq[Char]。 Scala不会执行像这样的两步隐式转换。

如果你写s => f(s),Scala是免费的同类型,这样s在以f传递之前转换为Seq[Char]摆弄。

+1

我有一种感觉,它与两步隐式转换限制有关。感谢您的解释! – dhg 2012-08-04 19:39:03

3

也许解决这个最好的方法是:

def f[S <% Seq[Char]](s: S): S = /* some code */ 

然后,如预期map和朋友将工作。