2012-10-20 16 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方法は、経験豊富な機能プログラマのための明白に見えるかもしれませんが、他の誰のためにそれを理解するのは難しいです。

なぜScalazコードにはほとんどドキュメントがありませんか?

なぜ彼らは多くの演算子を使用して、ほとんどの人に読めないのですか? コピー/貼り付けなしでまたはと入力する方法がわかりません。それは多くの人がいるため、単なる例です。

一部の人々はScalazは最初は読めないと言っていますが、2年後にはそれはすばらしいことがあります。 Scalazをどこから始めるべきなのだろうか。 Scalaのバリデーションは一番簡単な部分ですが、それ以降は?

+4

私の知る限りでは、ほとんどの特殊記号は冗長、非ユニコードコンパニオンを持っています。 ScalazはHaskellを模倣しており、そのシンボルの多くはHaskellの土地に由来しています(次の質問はHaskellが非常に多くのシンボル*を使用する理由です)(http://ro-che.info/ccc/15.html))。個人的に私は*初心者* scalaプログラマがscalazを使うべきではないと思う。 –

+0

@ om-nom-nomわかりました。私はScalaの初心者だと言いますが、それは私の視点ですが、私はCourseraのMartin Oderskyコースに続き、本を読んで3ヶ月間使って、すぐに実稼働する現実のwebappを構築しています。私はScalazの使い方を理解しようとするべきかどうかは分かりません。なぜなら、私がそれを理解しなくても、Scalaの初心者を考え続けるからです。 –

+3

scalazは型がないと同じレベルにあります。 Scalaの網羅的なマクロプログラミングのためのライブラリ。これらの部分はすべて、Scalaのユーザーコアの一部ではないことがあります。可能なことを証明するための実験であり、新しいレベルに抽象化する方法です。 Scalaの高次の部分を理解することができずに、高度なScalaプログラマであると言えるのは、Odersky氏が[Scalaのレベル]で述べたことです(http://www.scala-lang.org/ノード/ 8610)。 – sschaef

答えて

13

私はScalazのほとんどが文書化されていないことに同意します。問題は、Haskell(そして基礎となる数学)から多くの先進的な概念を収集し、それらをすべて詳細に文書化することは、関数型プログラミング(および数学)に関する全書を書くことになるということです。

  • あなたが知っているとScalaのために準備関数型プログラミングからいくつかの概念が必要な場合は、あなたが最も可能性が高いそれをここに見つけることができます:だから私はScalazのアプローチがあると信じています。
  • わからない場合は、別の場所で習得する必要があります。

あなたがKleisli categoriesを知っていて、すべてのモナドがどのように上昇するかを知っていれば、定義は完全に自己完結型です。あなたがしない場合、KleisliCategoryはあなたにとっては役に立たない。

(私の経験では、Haskellは関数型プログラミングから高度な概念を学習するためのより良いです。ScalaはJavaのよりもはるかに優れているものの、それはまだJavaのオブジェクト指向/クラッタ物事ビットが不可欠遺産を中心にドラッグします。)


ユニコード記号を検討する。ソースを見ると、彼らが唯一のシンタックスシュガーとして使用しているか、少なくとも彼らは非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) 

あなたが望むのであれば、あなたは、彼らなしで行くことができます。

まだ、私はScalazでそれらを持つことが良い考えであるかどうか分かりません。適切なフォントがない人のためにコードを読むことが不可能になる可能性があります。むしろ純粋なASCIIシンボルを好むでしょう。

7

始める場所は、多くの概念をカバーするHaskellを学ぶことです。

ウォッチクリス・マーシャル(@oxbow_lakes)scalaz会談:

http://skillsmatter.com/expert/scala/chris-marshallがscalazの著者のいくつかによって書かれたマニングからScalaで関数型プログラミングのコピーを取得します。

私は中に含まれる値を返します〜fooのようなオプションで様々な濃縮度である、検証よりscalazを開始するためのより簡単な場所があると言うだろう私のブログhttp://www.casualmiracles.com/blog/

上の小さな例のカップルを持っていますオプション、またはオプションの型(0の場合は0、文字列の場合は空の文字列など)を返します。

私は、任意のオープンソースプロジェクトと同じようにhttp://eed3si9n.com/

5

で学習Scalazと呼ばれる記事の非常に詳細な一連の約だけは本当に真と許容の答えを忘れて「なぜ自分より優れたドキュメントではありませんか?」 「誰もまだそれを書いていないので、あなたは自由にボランティアできます」

(私は正直、この答えはupvotesかdownvotesにつながるかどうかはわかりません。興味深い実験を。)

+10

私は問題があると思います。 – cdmckay

関連する問題