13

我可以定义一个接受Seq[Char]

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

如果我传入 a ,它会起作用String

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

这意味着我可以在 a 中使用它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)
                               ^
4

2 回答 2

11

您不能这样做,因为没有促进隐式转换A => BF[A] => F[B]. 特别是,f实际上是 type 的一个实例Seq[Char] => Seq[Char],您需要隐式转换 fromString => Seq[Char]会生成一个 function String => Seq[Char]。Scala 不做像这样的两步隐式转换。

如果您编写s => f(s),Scala 可以随意摆弄这些类型,以便sSeq[Char]传递到f.

于 2012-08-04T19:36:41.163 回答
3

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

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

然后,map和朋友会按预期工作。

于 2012-08-04T22:55:46.690 回答