Scala中的自定义控件结构?

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.

jsu*_*eth 7

我会使用部分功能:

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功能不是你所说的那么我建议使用原始模式匹配.