gpt4 book ai didi

scala - 通过调用 toSet 丢失参数类型错误

转载 作者:行者123 更新时间:2023-12-04 15:01:35 25 4
gpt4 key购买 nike

为什么此代码不起作用:

scala> List('a', 'b', 'c').toSet.subsets.foreach(e => println(e))

<console>:8: error: missing parameter type
List('a', 'b', 'c').toSet.subsets.foreach(e => println(e))
^

但是当我拆分它时,它工作正常:
scala> val itr=List('a', 'b', 'c').toSet.subsets
itr: Iterator[scala.collection.immutable.Set[Char]] = non-empty iterator

scala> itr.foreach(e => println(e))
Set()
Set(a)
Set(b)
Set(c)
Set(a, b)
Set(a, c)
Set(b, c)
Set(a, b, c)

这段代码也可以:
Set('a', 'b', 'c').subsets.foreach(e => println(e))

最佳答案

首先,有一个更简单的代码版本具有相同的问题:

List('a', 'b', 'c').toSet.foreach(e => println(e))

这也不起作用
List('a', 'b', 'c').toBuffer.foreach(e => println(e))

但是,这些工作正常:
List('a', 'b', 'c').toList.foreach(e => println(e))
List('a', 'b', 'c').toSeq.foreach(e => println(e))
List('a', 'b', 'c').toArray.foreach(e => println(e))

如果你去看看 List class documentation你会看到有效的方法返回了一些用 A 参数化的类型。 , 而不起作用的方法返回用 B >: A 参数化的类型.问题是 Scala 编译器无法确定哪个 B使用!这意味着如果你告诉它类型它将起作用:
List('a', 'b', 'c').toSet[Char].foreach(e => println(e))

现在至于为什么 toSettoBuffer有那个签名,我不知道...

最后,不确定这是否有帮助,但这也有效:
// I think this works because println can take type Any
List('a', 'b', 'c').toSet.foreach(println)

更新:再浏览一下文档后,我注意到该方法适用于所有具有协变类型参数的类型,但具有不变类型参数的类型具有 B >: A在返回类型中。有趣的是,虽然 Array在 Scala 中是不变的,它们提供了两个版本的方法(一个带有 A 和一个带有 B >: A ),这就是它没有该错误的原因。

我也从未真正回答过为什么将表达式分成两行有效。当您只需调用 toSet编译器会自动推断 AB在结果 Set[B] 的类型中,除非你给它一个特定的类型来选择。这就是类型推断算法的工作原理。但是,当您将另一个未知类型(即 lambda 中的 e 的类型)添加到混合中时,推理算法就会窒息而死——它无法处理未知的 B >: A。和未知类型 e也是。

关于scala - 通过调用 toSet 丢失参数类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13097399/

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