gpt4 book ai didi

scala - 抽象函数的可变参数数量

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

我有以下代码:

trait TypeLike
trait ArgLike
trait Predicate{
def name:String

}

case class Arg(name:String)

case class Predicate1[I1<:Arg,O<:TypeLike](name:String, arg1:I1, output:O, func: I1=> O) extends Predicate


case class Predicate2[I1<:Arg,I2<:Arg,O<:TypeLike](name:String, arg1:I1,arg2:I2, output:O, func: (I1,I2)=> O)
extends Predicate

如何将 "func" 放入 Predicate 特征中。我不知道如何定义具有可变输入数量的抽象函数。

最佳答案

不幸的是,您必须为此使用 HList。这是无形 HList 的示例:

import shapeless._

trait Predicate[Args <: HList, O <: TypeLike] {
implicit val lubWitness: LUBConstraint[Args, Arg]
def name: String
def func: Args => O
}

case class Predicate1[I1 <: Arg, O <: TypeLike](
name: String,
arg1: I1,
output: O,
func: I1 :: HNil => O
) extends Predicate[I1 :: HNil, O] {
implicit val lubWitness = implicitly[LUBConstraint[I1 :: HNil, Arg]]
}

case class Predicate2[I1 <: Arg, I2 <: Arg, O <: TypeLike](
name: String,
arg1: I1,
arg2: I2,
output: O,
func: I1 :: I2 :: HNil => O
) extends Predicate[I1 :: I2 :: HNil, O] {
implicit val lubWitness = implicitly[LUBConstraint[I1 :: I2 :: HNil, Arg]]
}

// Example instantiation
val p1 = Predicate1("Example", Arg("test"), new TypeLike {},
(args: Arg :: HNil) => { println(args(0)); ??? })

解释

那么这里发生了什么? HList 基本上是类立体上的元组。让我们看一下我们的例子:

trait Predicate[Args <: HList, O <: TypeLike] {

Args <: HList表示 Args是类型列表。 O <: TypeLike是一个有界限的普通类型参数。

implicit val lubWitness: LUBConstraint[Args, Arg]

这表示我们需要证明 HList Args 中的每个类型是 Arg 的子类型(我假设这是一项要求。

def func: Args => O

采用“形状”HList 的函数 Args并返回 O . (如果愿意,您也可以将其写成方法。

case class Predicate1 /*snip*/ extends Preciate[I1 :: HNil, O]

Predicate1Predicate其参数列表包含一个类型为 I1 的元素.

implicit val lubWitness = implicitly[LUBConstraint[I1 :: HNil, Arg]]

检索并定义 I1 的见证是 Arg 的子类型(情况就是这样,因为 Predicate1 的声明中绑定(bind)了类型。

关于scala - 抽象函数的可变参数数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29684890/

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