whe*_*ies 3 functional-programming scala control-structure
在使用Java或C++进行编程时,有很多次我遇到了一个简单的模式,自定义控件结构可以减少代码中的样板.它类似于:
if( Predicate ){
Action
return Value
}
Run Code Online (Sandbox Code Playgroud)
也就是说,"return if"类型语句.我已经尝试过制作带有签名的功能foo[A,B]( pred:((A,A)=>Boolean), value:Option[B] )
但是我最终会检查我是否已经返回了Some或None.我被return
声明绊倒了.
是否有继承方式在函数式语言或更具体的Scala中创建这样的控制结构?
编辑:
我的描述并不那么清楚,而且那些试图帮助我的人会感到困惑.我foo
不工作的关键原因是它不能使包含函数的评估短路.那是
def intersect( geometry:Geometry, reference:Geometry ):Geometry = {
return_if( withinBounds( geometry, projection ), logToString( logger, "Geometry outside " + projection.toString ), EmptyGeometry() )
return_if( topologicallyCorrect( geometry ), intersect( correct( geometry ), reference )
//rest of the function
}
Run Code Online (Sandbox Code Playgroud)
并且仍允许在内部进行尾递归return_if
.
我会使用部分功能:
def whatevs[A, B](options : PartialFunction[(A,A), B]) : Option[B] = {
val myInput = generateInput
if(options.isDefined(myInput)) {
Some(options(myInput))
} else None
}
Run Code Online (Sandbox Code Playgroud)
然后您的用法可能如下所示:
whateves {
case (x,y) if x > y => "Biggerz"
case (x,y) if y > x => "Tiny!"
}
Run Code Online (Sandbox Code Playgroud)
通常,您不需要return语句.If-expression将计算到每个块中使用的最后一个表达式.您可能需要帮助编译器找出if表达式的类型结果,但不需要返回.
部分函数是一种在某些条件成立时执行操作的机制.在上文中,两个条件是来自元组的x> y或y> x.
如果whatevs功能不是你所说的那么我建议使用原始模式匹配.