Scala: почему я не могу сопоставить функцию, принимающую Seq [Char] над набором строк
Я могу определить функцию, которая принимает 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)
^
Ответы
Ответ 1
Вы не можете этого сделать, потому что не поддерживается продвижение неявного преобразования A => B
в F[A] => F[B]
. В частности, f
на самом деле является экземпляром типа Seq[Char] => Seq[Char]
, и вам потребуется, чтобы неявное преобразование из String => Seq[Char]
создало функцию String => Seq[Char]
. Scala не выполняет двухэтапные неявные преобразования, такие как.
Если вы пишете s => f(s)
, Scala может свободно возиться с типами, чтобы s
был преобразован в Seq[Char]
, прежде чем передать его в f
.
Ответ 2
Возможно, лучший способ решить эту проблему:
def f[S <% Seq[Char]](s: S): S = /* some code */
Затем map
и друзья будут работать, как ожидалось.