gpt4 book ai didi

generics - 编写我自己的通用 map 函数

转载 作者:行者123 更新时间:2023-12-02 19:09:14 24 4
gpt4 key购买 nike

我正在尝试编写自己的通用 map 函数,以下是我想到的:

def map[A, B, CC[X] <: Traversable[X], That]             
(xs: CC[A])(f: A => B)
(implicit cbf: CanBuildFrom[CC[_], B, That]): That = {
val b = cbf(xs)
for (a <- xs)
b += f(a)
b.result
}

这似乎适用于ListVector,但不适用于Map。我应该进行哪些更改才能使其与 Map 一起使用?

最佳答案

您的代码编译并运行得很好(注意:我使用的是 Scala 2.9.0.1。您可能需要提及您正在使用的 Scala 版本。)

但是,当您的 map 函数应用于 Map 时,即使返回 Map< 有意义,也始终返回 List/本身。您可以通过将 CC[_] 更改为 CC 来避免这种情况。 (相关博文:A Generic Quicksort in Scala。)

def map[A, B, CC <: Traversable[A], That]
(xs: CC)(f: A => B)
(implicit cbf: CanBuildFrom[CC, B, That]): That = {
val b = cbf(xs)
for (a <- xs)
b += f(a)
b.result
}

但是在调用这个函数时你需要显式地对它进行类型注释,这有点悲伤。

val xs = Map(45 -> 32, 11 -> 9)
map[(Int, Int), (Int, Int), Map[Int, Int], Map[Int, Int]](Map(45 -> 32, 11 -> 9))(identity)
// gives Map(45 -> 32, 11 -> 9)

一定有某种方法可以避免这种丑陋的类型注释,但我不知道。

关于generics - 编写我自己的通用 map 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6798260/

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