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

2 に答える 2

11

A => Bへの暗黙的な変換の昇格がないため、これを行うことはできませんF[A] => F[B]。特に、fは実際には type のインスタンスでありSeq[Char] => Seq[Char]、 からの暗黙的な変換String => Seq[Char]によって function が生成される必要がありますString => Seq[Char]。Scala は、このような 2 段階の暗黙的な変換を行いません。

と書くs => f(s)と、Scala は自由に型をいじることができるので、に渡される前に にs変換されます。Seq[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 に答える