我有一张地图:
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)
答案 0 :(得分: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
会出现同样的错误。
flatMap
上的{p> String
将Char ⇒ GenTraversableOnce[B]
作为参数。 String
不是GenTraversableOnce
,因此(Char => String)
(和Map[Char, String]
)不是Char ⇒ GenTraversableOnce[B]
。
Scala将Map.apply
和Map(_)
重写为x => Map(x)
,然后将隐式转化应用于功能结果:
x => augmentString(Map(x))
它可以将Map(x)
转换为获取Char ⇒ GenTraversableOnce[Char]
类型的函数,但它无法将Char => String
类型的现有函数转换为Char ⇒ GenTraversableOnce[Char]
,因为没有这样的隐式转换是范围。
答案 1 :(得分:3)
获得等效的行
digits flatMap(mnem(_)) // mnem's apply method is the actual method passed to flatMap
你想要
digits flatMap mnem.apply
答案 2 :(得分:-1)
由于Map
不是函数,因此apply
方法中定义的Map
方法可以将Map的对象充当方法 }}。 flatMap
需要一个函数(不是一个方法),这就是你需要使用mnem(_)
将它转换为函数的原因。