gpt4 book ai didi

Scala:泛型的类型推断及其类型参数

转载 作者:行者123 更新时间:2023-12-04 02:23:05 25 4
gpt4 key购买 nike

假设我有一个任意单参数泛型类的实例(我将在演示中使用 List 但这可以用于任何其他泛型)。

我想编写可以接受实例的泛型函数 (c) 并且能够理解什么泛型类 (A) 和什么类型的参数 ( >B) 生成了该实例的类 (C)。

我想出了这样的东西(函数体并不是真正相关的,但证明 C 符合 A[B]):

def foo[C <: A[B], A[_], B](c: C) {
val x: A[B] = c
}

...如果你这样调用它,它就会编译:

foo[List[Int], List, Int](List.empty[Int])

...但是如果我省略显式类型参数并依赖于推理,编译将失败并出现错误:

foo(List.empty[Int])

我得到的错误是:

    Error:Error:line (125)inferred kinds of the type arguments (List[Int],List[Int],Nothing) do not conform to the expected kinds of the type parameters (type C,type A,type B).
List[Int]'s type parameters do not match type A's expected parameters:
class List has one type parameter, but type A has one
foo(List.empty[Int])
^
Error:Error:line (125)type mismatch;
found : List[Int]
required: C
foo(List.empty[Int])
^

如您所见,Scala 的类型推断在这种情况下无法正确推断类型(似乎它猜测第二个参数是 List[Int] 而不是 ListNothing 而不是 3rd 的 Int

我假设我提出的 foo 的类型界限不够精确/正确,所以我的问题是我如何实现它,以便 Scala 可以推断参数?

注意:如果有帮助,可以假设所有潜在的泛型(A)都继承/符合某个共同的祖先。例如,A 可以是从 Seq 继承的任何集合。

注意:这个问题中描述的示例是合成的,是我试图解决的更大问题的提炼部分。

最佳答案

这是当前 Scala 类型构造函数类型推断的一个已知限制。将形式参数 c 的类型定义为 C 只会收集 C 的类型约束(并间接地收集到 A)而不是 B。换句话说 List[Int] <: C => { List[Int] <: C <: Any, C <: A[_] <: Any } .

有一个非常简单的翻译可以指导此类情况的类型推断。在您的情况下是:

def foo[C[_] <: A[_], A[_], B](c: A[B]) { val x: A[B] = c }

相同的语义,只是类型签名略有不同。

关于Scala:泛型的类型推断及其类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25888719/

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