gpt4 book ai didi

Scala:返回值组件上的orElse

转载 作者:行者123 更新时间:2023-12-02 06:22:08 24 4
gpt4 key购买 nike

我的任务是将审计跟踪附加到一系列计算上,以便在事后重建值(value)(即具有业务领域知识的人来破译哪里出了问题。)当前代码如下所示:

def doSomething = f(x) orElse g(x,y,z) orElse h(p,q,r) orElse default

其中每一个都返回一个选项。新代码应该返回一个元组 (Option, Audit.)

我已经将它实现为

def doSomething = f(x) match{
case None => g_prime(x,y,z)
case x @ Some(_) => (x, SomeAuditObject)
}
//and taking some liberties with the actual signature...
def g_prime(x,y,z) = g(x,y,z) match{

依此类推,直到“默认”。每个功能链接到下一个和下一个等等。我不喜欢它。感觉太迫切了。我错过了什么。有一些我只是没有看到的思考这个问题的方法。除了将返回值包装到另一个 Option 中,它是什么?

最佳答案

您可以使用 Monad 来组合留下审计线索的转换。您可以在 Monad 中编写审计。看看this answer了解更多详情。

我试着为你举了一个例子。我不知道如何处理 for-comprehension 的最后一步,即 map 并且不提供审计跟踪。如果您不允许使用 map,则不能使用 for-comprehensions,而必须使用对 flatMap 的普通调用。

case class WithAudit[A](value: A, audit: String){
def flatMap[B](f: A => WithAudit[B]): WithAudit[B] = {
val bWithAudit = f(value)
WithAudit(bWithAudit.value, audit + ":" + bWithAudit.audit)
}
def map[B](f: A => B): WithAudit[B] = {
WithAudit(f(value), audit + ":applied unknown function")
}
}

def doSomething(in: Option[Int]): WithAudit[Option[Int]] = WithAudit(
in.map(x => x - 23),
"substract 23"
)

def somethingElse(in: Int): WithAudit[String] = WithAudit(
in.toString,
"convert to String"
)


val processed = for(
v <- WithAudit(Some(42), "input Some(42)");
proc <- doSomething(v);
intVal <- WithAudit(proc.getOrElse(0), "if invalid, insert default 0");
asString <- somethingElse(intVal)
) yield asString

println(processed)

输出将是

WithAudit(
19,
input Some(42)
:substract 23
:if invalid, insert default 0
:convert to String
:applied unknown function
)

安全

使用 flatMap 来处理值强制提供审计。如果您不提供 map 并限制从 monad 中提取值的方式(如果您这样做,可能会写一个日志输出),您可以非常安全地假设值的每个转换都会得到记录。获得该值后,您将在日志中获得一个条目。

关于Scala:返回值组件上的orElse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7448752/

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