【问题标题】:Naming scheme for helper functions in ScalaScala 中辅助函数的命名方案
【发布时间】:2011-09-12 11:53:47
【问题描述】:

在 Haskell 中,当我需要一个快速的辅助函数或辅助值时,我通常使用数学中广泛使用的素数 (')。例如,如果我要编写一个 reverse 函数并需要一个尾递归工作器,我将其命名为 reverse'

在 Scala 中,函数名不能包含 '。 Scala 中是否有任何普遍接受的辅助函数和值命名方案?

【问题讨论】:

    标签: scala haskell naming-conventions


    【解决方案1】:

    为什么不在使用它的方法中声明该方法呢?然后,您可以将其称为“助手”或任何您喜欢的名称,而不必担心名称冲突。

    scala> def reverse[A](l:List[A]) = {
         |   def helper(acc:List[A],rest:List[A]):List[A] = rest match {
         |     case Nil => acc
         |     case x::xs => helper(x::acc, xs)
         |   }
         |   helper(Nil, l)
         | }
    reverse: [A](l: List[A])List[A]
    
    scala> reverse(1::2::3::Nil)
    res0: List[Int] = List(3, 2, 1)
    

    【讨论】:

    • 除此之外,您仍然可以将其称为反向,因为签名各不相同。
    • 我更喜欢loop这个名字,因为它的意义是循环的。
    • 我也使用loop。如果内部方法有一种累加器值,我使用后缀Acc。非特定内部方法的典型 Haskell 名称是 go
    • @agilesteel:使用不同签名反向调用它的问题是,如果给定名称有两个重载,则类型推断停止从调用流向其参数,这意味着您将通常需要更多的类型注解。
    【解决方案2】:

    如果我记得我在 2004 年参加的 Martin Odersky 的编程课程,我想他使用了 0 后缀作为辅助函数——定义在主函数的主体中。

    def reverse(...) = {
      def reverse0(...) = {
        // ...
      }
      reverse0(...)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-20
      • 1970-01-01
      • 2016-05-29
      • 2015-01-28
      • 2019-02-28
      • 2015-10-17
      • 2012-12-20
      相关资源
      最近更新 更多