3

我有一张地图:

  val mnem = Map(
    '2' -> "ABC", '3' -> "DEF", '4' -> "GHI", '5' -> "JKL",
    '6' -> "MNO", '7' -> "PQRS", '8' -> "TUV", '9' -> "WXYZ")

我很好奇为什么我不能将此地图作为映射函数传递,因为 Map 既是一个集合又是一个函数,如下所示

val digits = "2345"                       //> digits  : String = 2345

digits flatMap mnem                       //> ERROR

但我可以做到这一点

digits flatMap(mnem(_))                   //> res0: String = ABCDEFGHIJKL

我试图做与此类似的事情:

digits map mnem                           //> res1: scala.collection.immutable.IndexedSeq[String] = Vector(ABC, DEF, GHI, 
                                              //| JKL)    
4

3 回答 3

4

Map[Char, String]是一个函数(Char => String)

trait Map[A, +B] extends ... MapLike[A, B, Map[A, B]] 
trait MapLike[A, +B, ...] extends PartialFunction[A, B] ...
trait PartialFunction[-A, +B] extends (A) ⇒ B

这工作正常:

val f: Char => String = mnem

你会得到同样的错误digits flatMap f

flatMapon作为参数StringChar ⇒ GenTraversableOnce[B]And Stringis not a GenTraversableOnce,所以(Char => String)(and Map[Char, String]) is not Char ⇒ GenTraversableOnce[B]

Scala 重写Map.applyand Map(_)asx => Map(x) 然后对函数结果应用隐式转换:

x => augmentString(Map(x))

它可以转换Map(x)为 get 类型的函数Char ⇒ GenTraversableOnce[Char],但它不能将现有的类型函数转换为Char => StringChar ⇒ GenTraversableOnce[Char]因为没有这种隐式转换是作用域。

于 2013-10-28T07:55:53.763 回答
3

得到等价的线

digits flatMap(mnem(_)) // mnem's apply method is the actual method passed to flatMap

你要

digits flatMap mnem.apply
于 2013-10-28T04:30:23.387 回答
-1

因为Map不是一个函数,而是 Map 的对象可以作为一个方法,因为apply方法定义在Map. flatMap需要一个函数(不是方法),这就是为什么你需要使用mnem(_)它来将它转换为一个函数。

于 2013-10-28T04:29:09.857 回答