gpt4 book ai didi

scala - 在 Scala 中使用 andThen 链接 PartialFunctions

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

让我们重用 Daily scala 中的示例:

type PF = PartialFunction[Int,Int]

val pf1 : PF = {case 1 => 2}

val pf2 : PF = {case 2 => 3}

让我们补充一下:
val pf3 : PF = {case 3 => 4}

然后在这里按预期工作:
pf1 andThen pf2 isDefinedAt(x)

返回 true伊夫 x == 1 (实际上, pf2 根本不需要是 PartialFunction)

但是,我预计:
pf1 andThen pf3 isDefinedAt(x)

会返回 false所有 x (即,如果定义了 pf1,则检查 pf3),但它不会且仅验证 pf1。

最后, pf1 andThen pf3 lift(x)总是导致 MatchError。我宁愿得到 None ……我可以通过提升每个函数来获得这种行为,例如 pf1.lift(x).flatMap(pf3.lift)但是有没有更简单的方法使用纯 PartialFunction API? (并且没有单独提升每个部分功能?)

最佳答案

如果你看 andThen :

def andThen[C](k: (B) => C): PartialFunction[A, C]

这将接收器与函数而不是部分函数组合在一起。即, k预计将被完全定义,它没有 isDefinedAt .因此,生成的偏函数不需要改变 isDefinedAt 的行为。 ,它仍然只需要引用第一个部分功能。

您可以编写自己的扩展,由两个部分函数组成:
implicit class ComposePartial[A, B](pf: PartialFunction[A, B]) {
def collect[C](that: PartialFunction[B, C]): PartialFunction[A, C] =
new PartialFunction[A, C] {
def apply(a: A): C = that(pf(a))
def isDefinedAt(a: A) = pf.isDefinedAt(a) && {
val b = pf(a)
that.isDefinedAt(b)
}
}
}

pf1 collect pf2 isDefinedAt(1) // true
pf1 collect pf3 isDefinedAt(1) // false

问题是你必须调用 pf(a) ,因此鉴于 Scala 不强制执行纯度,您最终可能会意外地执行副作用。

关于scala - 在 Scala 中使用 andThen 链接 PartialFunctions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21041626/

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