gpt4 book ai didi

Scala,偏函数

转载 作者:行者123 更新时间:2023-12-04 06:09:59 26 4
gpt4 key购买 nike

有什么方法可以创建PartialFunction除了通过 case陈述?

我很好奇,因为我想表达以下内容(前面的 scala 伪!)...

val bi = BigInt(_)
if (bi.isValidInt) bi.intValue

...作为偏函数,并做
val toInt : PartialFunction[String, Int] = {
case s if BigInt(s).isValidInt => BigInt(s).intValue
}

似乎多余,因为我创建了一个 BigInt两次。

最佳答案

不确定我理解这个问题。但这是我的尝试:为什么不创建一个提取器?

object ValidBigInt {
def unapply(s: String): Option[Int] = {
val bi = BigInt(s)
if (bi.isValidInt) Some(bi.intValue) else None
}
}

val toInt: PartialFunction[String, Int] = {
case ValidBigInt(i) => i
}

另一种选择是(这可以回答是否可以创建 PartialFunction 而不是使用 case 文字的问题):
val toInt = new PartialFunction[String, Int] {
def isDefinedAt(s: String) = BigInt(s).isValidInt
def apply(s: String) = BigInt(s).intValue
}

然而,由于部分函数的想法是它只是部分定义,最后你仍然会做多余的事情——你需要创建一个 big int 来测试它是否有效,然后在函数应用程序中创建 big int再次...

我在 Github 看到了一个项目试图通过缓存来自 isDefinedAt 的结果来解决这个问题。 .如果你深入到基准测试,你会发现它比默认的 Scala 实现慢:)

所以如果你想避开 isDefinedAt 的双重性质与 apply ,您应该直接使用提供 Option[Int] 的(完整)函数。结果。

关于Scala,偏函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5668053/

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