gpt4 book ai didi

scala - 具有更高种类类型的类的自类型注释

转载 作者:行者123 更新时间:2023-12-02 07:16:40 26 4
gpt4 key购买 nike

给定:

abstract class Databases[F[_]]

我怎样才能让这个特性发挥作用:

// Marker trait signalling the database plugin supports StaticRoles
trait StaticRoles { this: Databases[_] => }

我想确保 StaticRoles 只混入同样扩展 Databases 的类中,但是我不关心类型参数 的具体值>F.

代码返回:

error: _$1 takes no type parameters, expected: one

这是公平的,但是它返回相同的错误:

trait StaticRoles { this: Databases[_[_]] => }

我也试过:

trait StaticRoles { this: Databases[({type T[X[_]]})#T] => }

这给出了错误:

error: kinds of the type arguments (AnyRef{type T[X[_]]}#T) do not conform to the expected kinds of the type parameters (type F) in class Databases.
AnyRef{type T[X[_]]}#T's type parameters do not match type F's expected parameters:
type X has one type parameter, but type _ has none

最佳答案

正确的是

trait StaticRoles { this: (Databases[F] forSome { type F[_] }) => }

Is there a shorthand for type variable 'm forSome { type m[O] <: UpperBound[O] }` in Scala?

并非每个存在类型都可以用下划线表达或(在这种情况下)允许用下划线表达。

还有

trait StaticRoles { this: Databases[F forSome { type F[_] }] => }

与前者不同,但与前者相同

trait StaticRoles { this: Databases[Any] => }

自从

implicitly[(Databases[F forSome { type F[_] }]) =:= Databases[Any]]

(Any 实际上是多元的)。

Databases[Any]Databases[F] forSome { type F[_] } 的子类型

implicitly[Databases[Any] <:< (Databases[F] forSome { type F[_] })]

使用类型投影 (#) 正确的是

trait StaticRoles { this: Databases[({ type F[_] })#F] => }

Databases[({ type F[_] })#F] 也是 Databases[F] forSome { type F[_] } 的子类型(无法比较使用 Databases[Any] 用于不变的 Databases)。

在这三种类型中,Databases[F] forSome { type F[_] }Databases[Any]Databases[({ type F[ _] })#F] 只有第一个适用于

trait IO[_]

class Abc extends Databases[IO] with StaticRoles // compiles

//class Abc1 extends StaticRoles // doesn't compile

关于scala - 具有更高种类类型的类的自类型注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61215541/

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