2012-06-25 35 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個項目的元組)。

正如其他答案所說的那樣,它有助於獲得一些背景,但可能是您的示例受到標準庫中這些選擇的啓發(正確或錯誤)。

相關問題