gpt4 book ai didi

scala - 将正确类型别名为存在类型(为什么要编译?)

转载 作者:行者123 更新时间:2023-12-01 08:58:29 25 4
gpt4 key购买 nike

为什么我可以做以下事情:

class A
type M[_] = A

我希望我只能为需要一个类型参数的类型起别名,例如 List[_],但它也适用于普通类。

如果我创建一个方法:

def foo(m: M[_]) = m

并用错误的参数调用它:

scala> foo("a")
<console>:15: error: type mismatch;
found : String("a")
required: M[_]
(which expands to) A[]
foo("a")

我收到这样的错误。 A[] 是什么意思?

更进一步,如何解释这一点:

scala> type M[_, _] = A
<console>:12: error: _ is already defined as type _
type M[_, _] = A

有没有办法确保我放在别名右侧的内容是参数化类型?

最佳答案

type M[_] = Atype M[X] = A 相同:类型上的常量函数。 M[X]A 无论 X 是什么: M[Int]AM[String]AM[Any]A,等等。_ 在这种情况下只是一个标识符(它也解释了 type M[_, _] 的错误)。

当然,在def foo(m: M[_]) = m中,M[_]是一个存在类型:M[T] forSome { 输入 T } 。不过,我不知道为什么 Scala 在错误消息中说它扩展为 A[];这可能是一个错误。您可以通过调用

来检查它是否与 A 类型相同
scala> implicitly[M[_] =:= A]
res0: =:=[A[],A] = <function1>

Is there a way to assure that what I put on the right hand side of my alias will be a parametrized type?

你可以用higher-kind声明一个抽象成员类型

trait Foo { type M[_] }

并且它只能由参数化类型实现:

class Bar1 extends Foo { type M = Int } // fails
class Bar2 extends Foo { type M[X] = List[X] } // works

当然,如第一段所述,type M[X] = Int 中的 M 参数化的,而我不不认为有办法排除它。

关于scala - 将正确类型别名为存在类型(为什么要编译?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39654468/

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