gpt4 book ai didi

Scala 高级类型语法

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

我是 Scala 的新手,也是高级类型的新手。我想写这样的东西;

trait Actor[E[Dependency] <: Event[Dependency]] {
def execute(dependency: Dependency): Unit
}

但是我无法在 execute 方法中引用类型参数 Dependency - 编译器不知道它。

我知道我可以在没有 HKT 的情况下通过以下方式解决它,但这不是这个问题的目的;

trait Actor[T <: Event[Dependency], Dependency] {
def execute(dependency: Dependency): Unit
}

我想了解为什么它不适用于我尝试过的更高类型的语法?有可能用 HKT 来表达吗?这是 HKT 的有效用例吗?


编辑

更多信息,Event 看起来像这样;

trait Event[Data] {
val payload: Data
}

...我希望定义这样的事件和参与者;

case class FooEvent(payload: Foo) extends Event[Foo]

class FooActor extends Actor[FooEvent] {
def execute(dependency: Foo) = {}
}

最佳答案

我会尝试改进 Alexey 的回答 - 他是对的,但他太矮了。但我必须说我不是 HKT 的专家,我想我才刚刚开始理解这个概念。

在您的代码中 E[Dependency]E[_] 相同,表示您有 E 并将某些类型作为参数.这意味着您不会将 Dependency 作为类型进行操作。您也不要将 EE[Dependency] 作为类型进行操作。 E 是类型构造函数,如果我理解正确的话,E[Dependency] 是存在类型。请注意

trait Actor[E[D] <: Event[D]] { def execute(d: E) {} }

trait Actor[E[D] <: Event[D]] { def execute(d: E[D]) {} }

也不会编译。

您需要指定正确的类型作为执行的参数:

trait Actor[E[D] <: Event[D]] { def execute[B](d: E[B]) {} }

这将编译为 E[B] 是此上下文中的类型。

更新:

请看这段代码:

  trait Event[P] {
val payload: P
}

case class FooEvent(payload: Int) extends Event[Int]

trait BaseActor {
type E = Event[P]
type P
def execute(dep: P)
def runEvent(event: E)
}

trait IntActor extends BaseActor {
type P = Int
}

class FooActor extends IntActor {
def execute(dependency: P) = {}
def runEvent(event: E) = {}
}

val c = new FooActor()
c.runEvent(FooEvent(5))
c.execute(5)

基本上,诀窍是定义 type P 这是我们的 Dependencytype E = Event[P] 这总是 Event[Dependency] 那么您可以通过定义 P 来使用 actor 而无需定义 E 因为它已经被定义了。不确定它是否解决了问题,但它看起来像是一种适合我的方式。这里的类型也太多了,有些像IntActor是没有必要的。我把它们放在这里是为了更容易理解这个例子

关于Scala 高级类型语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32801698/

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