gpt4 book ai didi

scala - 这种奇怪的类型[T*]

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

例如,我有以下函数连接开头和结尾,产生所有可能的连接变体作为结果:

def mixer1(begin: String, beginings: String*)(end: String, endings: String*) =
for (b <- (begin +: beginings); e <- (end +: endings)) yield (b + e)

其实函数做什么并不重要,我想这样改写:

  def mixer2(begin: String, beginings: String*):Function2[String, Seq[String], Seq[String]] = {
return new Function2[String, Seq[String], Seq[String]] {
def apply(end:String, endings:Seq[String]) = for(b <- (begin +: beginings); e <- (end +: endings)) yield b+e
}
}

显然,第二个不会按预期工作,因为 apply 的第二个参数的类型为 Seq[String] 而不是 String*(但它们都编译为 Seq[String]):

scala> mixer1("a","b")("c","d")
res0: Seq[java.lang.String] = ArrayBuffer(ac, ad, bc, bd)

scala> mixer2("a","b")("c","d")
<console>:10: error: type mismatch;
found : java.lang.String("d")
required: Seq[String]
mixer2("a","b")("c","d")

我如何(如果可以)重新定义 mixer2 函数?

最佳答案

试试这个方法:

def mixer2(begin: String, beginings: String*) = {
new ((String, String*) => Seq[String]) {
def apply(end: String, endings: String*) = for(b <- (begin +: beginings); e <- (end +: endings)) yield b+e
}
}

我们在 mixer2 上使用类型推断来获取正确的类型。这意味着 return 必须被删除,但这没关系,因为它是不必要的(并且通常建议不要在 Scala 上使用)。最大的技巧是为 Function 使用 A => B 语法糖,以便能够使用 String*。然后按预期更改 apply

关于scala - 这种奇怪的类型[T*],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4276368/

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