2012-06-25 40 views
0

我见过一些API有def foo,然后有一个略有不同的def foo1,但我不明白这是什么意思,除了“foo1有点像foo,但略有不同”。它让我想起“Ex”(What does "Ex" stand for in Windows API function names?什么是Scala中的“foo”与“foo1”命名约定?

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

是否有隐含任何意义(没有foo1已经涉及到foo在某些特定的方式),或者是更多的“我需要两个类似的功能和重载是模糊的,拧,让我们把末端有一个1”?除了“这两个函数有某种相关性”之外,我应该假设什么?

+5

你能链接一些例子吗? – paradigmatic

+2

+1“一些API”并不值得继续。也许这些都是垃圾API,由白痴设计的? –

+0

好吧,我在想如果这是一个实际的约定,人们会知道它不知道具体的API ;-)我在看例如播放约定扩展/扩展1,玩Iteratee折叠/折叠1,我今天早上刚读关于我不熟悉的scalaz示例。 –

回答

1

我认为上下文可能就是这里的一切。我能想到的唯一例子是方法scalaz。由于库作者无疑会指出,这一方法实际上确实是完全透明的,从在类型本身看:

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

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

你说你已经看过几次了:你能指出其他事件吗?

+0

这里有一个fold1:https://github.com/playframework/Play20/blob/master/framework/src/play/src/main/scala/play/api/libs/iteratee/Iteratee.scala#L51和extend1: https://github.com/playframework/Play20/blob/master/framework/src/play/src/main/scala/play/api/libs/concurrent/Promise.scala#L53 –

2

我能想到的例子是reprep1scala.util.parsing.combinator.Parsers,其中rep是任何数量的重复和rep1为1以上。还有一个用于N重复的repN方法,所以这里后缀1的含义非常明显。

+0

所以在这种情况下1意味着1,而不是我猜想的“素数” –

0

Scala包含像Function和Tuple这样的类型,它们有一个类型族,每个成员都以它所需的参数数目命名。

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

Tuple1[T1] 
Tuple2[T1, T2] 

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

正如其他答案所说的那样,它有助于获得一些背景,但可能是您的示例受到标准库中这些选择的启发(正确或错误)。

相关问题