【问题标题】:What is the "foo" vs. "foo1" naming convention in Scala?Scala 中“foo”与“foo1”的命名约定是什么?
【发布时间】:2012-06-26 21:09:24
【问题描述】:

我看到一些 API 有一个 def foo 和一个稍微不同的 def foo1,但我不知道这意味着什么,除了“foo1 有点像 foo 但略有不同。”它让我想起了“Ex”(What does "Ex" stand for in Windows API function names?

我猜这是对 Haskell/FP 或数学约定的引用,它只是 foo-prime 吗?

是否暗示了任何含义(foo1 是否必须以某种特定方式与foo 相关联)还是更多“我需要两个类似的函数并且重载是模棱两可的,搞砸了,让我们在末尾加上一个 1 “?除了“这两个功能在某种程度上相关”之外,我是否应该假设任何事情?

【问题讨论】:

  • +1 “一些 API” 没什么好说的。也许这些都是白痴设计的垃圾 API?
  • 好吧,我在想如果它是一个实际的约定,人们会在不知道特定 API 的情况下知道它;-) 我正在查看例如 Play Promise 有 extend/extend1,Play Iteratee 有 fold/fold1,我今天早上刚读到一个我个人不熟悉的 scalaz 示例。
  • 如果没有人知道示例,我认为答案可能是“这不是众所周知的约定”。

标签: scala


【解决方案1】:

我能想到的例子是scala.util.parsing.combinator.Parsers中的reprep1,其中rep是任意数量的重复,rep1是1个或更多。还有一个repN的方法N重复,所以这里1后缀的含义很明显。

【讨论】:

  • 所以在这种情况下 1 表示 1,而不是我猜的“素数”
【解决方案2】:

我认为上下文可能就是这里的一切。我能想到的唯一例子是 scalaz 中的foldl1 方法。正如库作者无疑会指出的那样,从查看类型本身来看,该方法实际上做了什么完全透明的:

trait MA[M[_], A] {
  def foobar(f: (A, A) => A)(implicit FoldableM: Foldable[M]): Option[A]
}

但是,在这种情况下,它显然是foldl特殊形式,即向左折叠但使用第一个元素作为种子而不是显式提供的值时间>。因此foldl1 在上下文中是明智和直观的。

你说你见过几次:你能指出其他的发生吗?

【解决方案3】:

Scala 包含诸如 Function 和 Tuple 之类的类型,它们具有一系列类型,每个成员都根据它所接受的参数数量来命名。

Function1[T1] => R
Function2[T1, T2] => R

Tuple1[T1]
Tuple2[T1, T2]

在这两种情况下,类型的名称必须是不同的,并且使用参数的数量是描述类型的好方法(Function4 是带有 4 个参数的函数的类型,Tuple3 是包含 3项目)。

正如其他答案所说,了解一些上下文会有所帮助,但可能是您的示例受到标准库中这些选择的启发(正确或错误)。

【讨论】:

    猜你喜欢
    • 2011-08-20
    • 2012-11-09
    • 2011-10-06
    • 2022-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 2015-11-15
    相关资源
    最近更新 更多