加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如果定义了Option,则用于在链中应用函数的惯用Scala

发布时间:2020-12-16 08:49:20 所属栏目:安全 来源:网络整理
导读:是否有预先存在的/ Scala-idiomatic /更好的方法来实现这一目标? def sum(x: Int,y: Int) = x + yvar x = 10x = applyOrBypass(target=x,optValueToApply=Some(22),sum)x = applyOrBypass(target=x,optValueToApply=None,sum)println(x) // will be 32 我的
是否有预先存在的/ Scala-idiomatic /更好的方法来实现这一目标?

def sum(x: Int,y: Int) = x + y

var x = 10
x = applyOrBypass(target=x,optValueToApply=Some(22),sum)
x = applyOrBypass(target=x,optValueToApply=None,sum)
println(x) // will be 32

我的applyOrBypass可以像这样定义:

def applyOrBypass[A,B](target: A,optValueToApply: Option[B],func: (A,B) => A) = {
  optValueToApply map { valueToApply =>
    func(target,valueToApply)
  } getOrElse {
    target
  }
}

基本上我想要应用操作,具体取决于是否定义了某些Option值.如果不是,我应该得到预先存在的价值.理想情况下,我想链接这些操作,而不必使用var.

我的直觉告诉我,折叠或减少会涉及到,但我不确定它是如何工作的.或者也许还有另一种与monadic-fors有关的方法……

任何建议/提示赞赏!

解决方法

Scala有一种方法可以用于理解(如果你熟悉它,语法类似于haskell的表示法):

(for( v <- optValueToApply ) 
  yield func(target,v)).getOrElse(target)

当然,如果您要检查是否存在以下几个变量,这会更有用:

(for( v1 <- optV1
    ; v2 <- optV2
    ; v3 <- optV3
    ) yield func(target,v1,v2,v3)).getOrElse(target)

如果您尝试在选项列表上累积值,那么我建议您使用折叠,因此您的可选总和将如下所示:

val vs = List(Some(1),None,Some(2),Some(3))

(target /: vs) ( (x,v) => x + v.getOrElse(0) )
  // => 6 + target

在操作函数具有一些标识值的情况下,您可以概括这一点,标识:

(target /: vs) ( (x,v) => func(x,v.getOrElse(identity)) )

从数学上讲,这个条件是(func,identity)形成一个Monoid.但那就是旁边的.实际效果是,无论何时达到None,对它应用func并且x将始终产生x,(忽略None,并且一些值被打开并正常应用),这就是你想要的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读