如果定义了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,并且一些值被打开并正常应用),这就是你想要的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |