gpt4 book ai didi

Scala 方法类型参数不能接受 forSome 形式的存在类型

转载 作者:行者123 更新时间:2023-12-01 15:55:02 24 4
gpt4 key购买 nike

在 Scala 中,存在类型有以下两种形式:

 // placeholder syntax
List[_]
// forSome
List[T forSome {type T}]

但是,第二种形式似乎不能出现在方法类型参数位置(至少像我下面写的那样)。

  // placeholder syntax is Okay
scala> def foo[List[_]](x: List[_]) = x
foo: [List[_]](x: List[_])List[_]

scala> def foo[List[t forSome {type t}]](x: List[_]) = x
<console>:1: error: ']' expected but 'forSome' found.
def foo[List[T forSome {type T}]](x: List[_]) = x
^

// being as upper bound is also Okay
scala> def foo[A <: List[T forSome { type T }]](x: A) = x
foo: [A <: List[T forSome { type T }]](x: A)A

// type alias is a possible way but that is not what I want
scala> type BB = List[T forSome {type T}]
defined type alias BB

scala> def foo[BB](x: List[_]) = x
foo: [BB](x: List[_])List[Any]

我已经尝试了一段时间,但无法找到成功编译第二个的正确方法。那么这只是对方法类型参数的一些限制,还是我在这里遗漏了一些东西。

最佳答案

令人困惑的是,foo 中的下划线 (_) 确实表示存在类型。

让我们看看以下内容的实际含义:

def foo[List[_]](x: List[_]) = x

List 这里是一个更高种类的类型参数(顺便说一句,not 指的是 scala 的内置 List 类型——又名scala.collection.immutable)。该类型参数本身有一个类型参数,用下划线 (_) 表示。

现在很明显 List[_] 在这里不是存在的,因此 forSome 没有必要去那里。

但是,您可以在 x 类型中使用 forSome。以下相当于 foo 的原始定义:

def foo[List[_]](x: List[T] forSome { type T }) = x

话又说回来,这可能仍然不是您想要的,因为 List 仍然是类型参数,而不是 scala.collection.immutable。您可能想要的是:

def foo(x: List[T] forSome { type T }) = x

这与:

相同
def foo(x: List[_]) = x

关于Scala 方法类型参数不能接受 forSome 形式的存在类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31937965/

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