scala - Scala 中的自定义控制结构?

标签 scala functional-programming control-structure

在用 Java 或 C++ 编程时,我多次遇到过一个简单的模式,其中自定义控制结构可以减少我代码中的样板。它是这样的:

 if( Predicate ){
     Action

     return Value
 }

也就是说,一个“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
}

并且仍然允许在 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
}

那么您的用法可能如下所示:
whateves {
   case (x,y) if x > y =>   "Biggerz"
   case (x,y) if y > x =>   "Tiny!"
}

通常,您不需要 return 语句。 If-expression 将计算为每个块中使用的最后一个表达式。您可能需要帮助编译器找出 if 表达式的类型结果,但不需要返回。

偏函数是一种在某些条件成立时执行操作的机制。在上面,两个条件是 x > y 或 y > x 来自元组。

如果 whatevs 函数不是你所说的,我建议使用原始模式匹配。

关于scala - Scala 中的自定义控制结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3575780/

相关文章:

scala - Kotlin:花括号围绕几个表达式(或语句)

clojure - clojure 中的不变性与按值传递不同吗?

javascript - 打破数组循环函数(map、forEach 等)的循环

Python - 如果不是 0.0 的语句

scala - 左反加入Spark?

在 if-else 之外无法访问 Scala val

scala - Spark : Read file only if the path exists

linux - 简单的 Erlang 示例无法运行(错误)

functional-programming - Idris 中依赖类型函数自动检测域

php - 这段PHP代码可以去掉for循环吗?