gpt4 book ai didi

scala 列表 map 与mapConserve

转载 作者:行者123 更新时间:2023-12-02 11:07:03 24 4
gpt4 key购买 nike

我正在尝试理解mapConserve,据说它“与xs map f类似,但如果函数f将所有元素映射到自身,则返回xs不变”,来自List 。然而,它给出了错误。

def map [B] (f: (A) ⇒ B): List[B]
def mapConserve (f: (A) ⇒ A): List[A]
def mapConserve [B >: A <: AnyRef] (f: (A) ⇒ B): List[B]


scala> list map (x=>x)
res105: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> list mapConserve (x=>x)
<console>:12: error: inferred type arguments [Int] do not conform to method mapConserve's type parameter bounds [B >: Int <: AnyRef]
list mapConserve (x=>x)
^

mapConserve 代码应满足 (A) => A 函数。如果不是,它仍然应该满足 (A) => B 函数,因为类型 A 可以是其自身的子类型和父类(super class)型。请告诉我mapConserve的目的和错误。

最佳答案

实际上,mapConserve 定义为

def mapConserve[A <: AnyRef](xs: List[A])(f: A => A): List[A]
def mapConserve[B >: A <: AnyRef](f: A => B): List[B]

所以A应该是AnyRef的子类型。 Int is a subtype of AnyVal ,这会带来错误。

scala> val l = List("foo", "bar", "baz")
l: List[java.lang.String] = List(foo, bar, baz)

scala> l.mapConserve(_.toUpperCase)
res4: List[java.lang.String] = List(FOO, BAR, BAZ)

scala> l.mapConserve(identity)
res5: List[java.lang.String] = List(foo, bar, baz)

更新:

mapmapConserve 之间的唯一区别,如 scaladoc 中所述。 :

Builds a new list by applying a function to all elements of this list. Like xs map f, but returns xs unchanged if function f maps all elements to themselves (as determined by eq).

scala> val xs = List.fill(1000000)("foo")
xs: List[java.lang.String] = List(foo, foo,...)

scala> xs.map(identity) eq xs
res48: Boolean = false

scala> xs.mapConserve(identity) eq xs
res49: Boolean = true

在我的简单基准测试中,xs mapConserve Identity 的速度大约快五倍。

关于scala 列表 map 与mapConserve,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8612507/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com