2012-10-20 21 views
23

我有時候在看Scalaz,覺得很難理解一個初學Scala程序員。爲什麼Scalaz使用複雜的符號並且沒有代碼文檔?

implicit def KleisliCategory[M[_]: Monad]: Category[({type λ[α, β]=Kleisli[M, α, β]})#λ] = new Category[({type λ[α, β]=Kleisli[M, α, β]})#λ] { 
    def id[A] = ☆(_ η) 
    def compose[X, Y, Z](f: Kleisli[M, Y, Z], g: Kleisli[M, X, Y]) = f <=< g 
    } 

    implicit def CokleisliCategory[M[_]: Comonad]: Category[({type λ[α, β]=Cokleisli[M, α, β]})#λ] = new Category[({type λ[α, β]=Cokleisli[M, α, β]})#λ] { 
    def id[A] = ★(_ copure) 
    def compose[X, Y, Z](f: Cokleisli[M, Y, Z], g: Cokleisli[M, X, Y]) = f =<= g 
    } 

對於有經驗的函數式程序員來說,斯卡拉斯方法可能看起來很明顯,但對其他任何人來說都很難理解。

爲什麼Scalaz代碼中的文檔很少?

爲什麼他們使用這麼多的操作員,大多數人無法閱讀? 我甚至不知道如何在沒有複製/粘貼的情況下輸入。這只是一個例子,因爲有很多。

有人說斯卡拉茲在開始時是不可讀的,但2年後他們發現它很棒。 我不知道從哪裏開始Scalaz。斯卡拉驗證似乎是最簡單的部分,但之後呢?

+4

據我所知,大多數特殊符號有一個詳細的,非Unicode伴侶。斯卡拉斯模仿哈斯克爾,許多符號來自哈斯克爾的土地(所以下一個問題是[*爲什麼哈斯克爾使用這麼多符號*](http://ro-che.info/ccc/15.html))。而且我個人認爲*初學者* scala程序員不應該使用scalaz。 –

+0

@ om-nom-nom我明白了。我說我是一個Scala初學者,這是我的觀點,但是我正在關注Coursera的Martin Odersky課程,閱讀這本書,現在使用它3個月,來構建一個即將在生產中的真實世界web應用程序。我只是想知道什麼時候應該嘗試使用/理解Scalaz,因爲直到我不明白爲止,我會一直考慮自己是一個Scala初學者:) –

+3

scalaz與無形狀相同,可能下一次會出現一個用於Scala中詳盡宏觀編程的庫。所有這些部分在一起,他們不是Scala的用戶核心的一部分 - 他們是實驗來證明什麼是可能的,以及如何抽象到新的水平。一個人可以說他/她是一名高級Scala程序員,但他無法理解Scala的高階部分 - 這也是Odersky在他的[Scala levels]中所說的(http://www.scala-lang.org/節點/ 8610)。 – sschaef

回答

13

我同意斯卡拉斯大多是無證的。問題在於它從Haskell(和底層數學)收集了很多先進的概念,並將它們詳細記錄下來,將成爲一本關於函數式編程(和數學)的書。所以我相信斯卡拉斯的做法是:

  • 如果您知道並需要一些爲Scala編寫的函數式編程的概念,那麼您很可能會在此處找到它。
  • 如果你不知道它,你將不得不在其他地方瞭解它。

讓我們來看看你的例子:如果你知道Kleisli categories以及每個單子如何產生一個,定義是相當獨立的。如果你不這樣做,那麼KleisliCategory對你無用。

(以我的經驗,Haskell是學習從函數式編程的先進理念更好。雖然Scala是遠遠比Java更好,但它仍然拖累圍繞Java的面向對象/勢在必行遺產雜波事情有點。)


考慮Unicode符號。看着來源似乎他們只是作爲一種語法糖,或者至少他們有一個非Unicode對應:

def ☆[M[_], A, B](f: A => M[B]): Kleisli[M, A, B] = kleisli(f) 
def η[F[_]](implicit p: Pure[F]): F[A] = pure 
def cokleisli[W[_], A, B](f: W[A] => B): Cokleisli[W, A, B] = ★(f) 

所以,你可以去沒有他們,如果你想要的。

不過,我不確定是否讓他們在斯卡拉茲是個好主意。這可能會讓代碼無法閱讀缺乏正確字體的人。我寧願選擇純粹的ASCII符號。

7

開始的一個地方是閱讀學習你的Haskell,它涵蓋了許多概念。

關注克里斯·馬歇爾(@oxbow_lakes)scalaz會談:http://skillsmatter.com/expert/scala/chris-marshall

曼寧寫了一些scalaz的作者獲取函數式編程的副本斯卡拉。

我有幾個小例子在我的博客http://www.casualmiracles.com/blog/

我會說有更容易的地方入手scalaz比驗證,這是很喜歡〜FOO選項的各種富集返回包含在價值選項或選項類型的「零」(數字爲0,字符串等爲空字符串)。

我忘了一個非常詳細的系列文章叫做學習Scalaz在http://eed3si9n.com/

5

與任何開源項目,只有真的和可接受的答案,「爲什麼不是他們更好的文檔?」是「因爲沒有人寫過它,你可以自由地進行志願服務。」

(老實說,我不知道這樣的回答是否會導致upvotes或downvotes。有趣的實驗。)

+10

我認爲問題是,你不能爲你不明白的東西寫文檔。 – cdmckay

相關問題