Подтвердить что ты не робот

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)
                               ^
4b9b3361

Ответ 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 и друзья будут работать, как ожидалось.