2012-10-20 19 views
23

Đôi khi tôi nhìn vào Scalaz và thấy nó khá khó hiểu đối với một lập trình viên Scala mới bắt đầu.Tại sao Scalaz sử dụng các ký hiệu phức tạp và không có tài liệu trong mã?

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 
    } 

Phương pháp Scalaz có vẻ hiển nhiên đối với người lập trình chức năng có kinh nghiệm, nhưng đối với bất kỳ ai khác thì khó hiểu.

Tại sao có quá ít tài liệu trong mã Scalaz?

Tại sao họ sử dụng quá nhiều toán tử không thể đọc được đối với hầu hết mọi người? Tôi thậm chí không biết cách nhập hoặc mà không cần sao chép/dán. Và nó chỉ là một ví dụ bởi vì có rất nhiều.

Một số người nói rằng Scalaz không thể đọc được ngay từ đầu, nhưng 2 năm sau họ thấy nó tuyệt vời. Tôi tự hỏi bắt đầu từ đâu với Scalaz. Việc xác nhận Scala có vẻ là phần dễ nhất, nhưng sau đó?

+4

Theo như tôi biết, biểu tượng đặc biệt nhất có một người bạn đồng verbose, không unicode. Scalaz bắt chước Haskell và nhiều biểu tượng đến từ vùng đất Haskell (vì vậy câu hỏi tiếp theo là [* tại sao Haskell sử dụng nhiều ký hiệu *] (http://ro-che.info/ccc/15.html)). Và cá nhân tôi không nghĩ rằng * người mới bắt đầu * lập trình scala nên sử dụng scalaz. –

+0

@ om-nom-nom Tôi hiểu. Tôi nói tôi là một người mới bắt đầu Scala, đó là quan điểm của tôi, nhưng tôi đang theo đuổi các khóa học của Martin Odersky trên Coursera, đọc sách và sử dụng nó trong 3 tháng nay, để xây dựng một ứng dụng web thế giới thực sẽ sớm được sản xuất . Tôi chỉ tự hỏi khi nào tôi nên cố gắng sử dụng/hiểu Scalaz, bởi vì cho đến khi tôi không hiểu nó, tôi sẽ tiếp tục xem xét bản thân mình là một người mới bắt đầu Scala :) –

+3

scalaz là trên cùng cấp như shapeless và có lẽ thời gian tới sẽ có một thư viện để lập trình macro toàn diện trong Scala. Tất cả các bộ phận này cùng nhau, rằng chúng không phải là một phần của lõi người dùng của Scala - chúng là những thí nghiệm để chứng minh những gì có thể và làm thế nào để trừu tượng hóa các cấp độ mới. Một người được phép nói rằng anh ta/cô ấy là một lập trình viên Scala cao cấp mà không thể hiểu được các phần thứ tự cao hơn của Scala - đó cũng là điều mà Odersky đã nói trong [cấp độ Scala] của anh ấy (http://www.scala-lang.org/ nút/8610). – sschaef

Trả lời

13

Tôi đồng ý rằng Scalaz hầu như không có giấy tờ. Vấn đề là nó thu thập rất nhiều khái niệm tiên tiến từ Haskell (và toán học cơ bản) và ghi lại chúng một cách chi tiết sẽ trở thành viết một cuốn sách toàn bộ về lập trình hàm (và toán học). Vì vậy, tôi tin rằng phương pháp tiếp cận của Scalaz là:

  • Nếu bạn biết và cần một số khái niệm từ lập trình chức năng chuẩn bị cho Scala, bạn sẽ tìm thấy nó ở đây.
  • Nếu bạn không biết, bạn sẽ phải tìm hiểu ở nơi khác.

Hãy xem ví dụ của bạn: Nếu bạn biết Kleisli categories và cách mọi monads phát sinh, định nghĩa hoàn toàn độc lập. Nếu không, thì KleisliCategory sẽ không sử dụng cho bạn.

(Theo kinh nghiệm của tôi, Haskell là tốt hơn cho việc học khái niệm tiên tiến từ lập trình chức năng. Trong khi Scala là tốt hơn nhiều so Java, nó vẫn kéo xung quanh OO di sản Java/bắt buộc là clutters thứ một chút.)


Xem xét các ký hiệu Unicode. Nhìn vào các nguồn có vẻ như chúng chỉ được sử dụng như một đường cú pháp hoặc ít nhất chúng có một đối tác không phải là 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) 

Vì vậy, bạn có thể không có chúng nếu muốn.

Tuy nhiên, tôi không chắc chắn nếu có chúng trong Scalaz là một ý tưởng hay. Nó có thể làm cho các mã không thể đọc cho một người thiếu phông chữ thích hợp. Tôi thích các ký hiệu ASCII thuần túy hơn.

7

Một nơi để bắt đầu là đọc Tìm hiểu Bạn một Haskell bao gồm nhiều khái niệm.

(@oxbow_lakes) đàm phán scalaz Xem Chris Marshall: http://skillsmatter.com/expert/scala/chris-marshall

Nhận một bản sao của lập trình chức năng trong Scala từ Manning được viết bởi một số các tác giả của scalaz.

Tôi có một vài ví dụ nhỏ trên blog của tôi http://www.casualmiracles.com/blog/

tôi sẽ nói đó là nơi dễ dàng hơn để bắt đầu với scalaz hơn xác nhận, đó là làm phong phú khác nhau trên lựa chọn như ~ foo mà trả về giá trị chứa trong tùy chọn hoặc 'số không' cho loại tùy chọn (0 cho số, chuỗi trống cho Chuỗi v.v.).

Tôi quên về một loạt rất chi tiết của bài viết gọi là Learning Scalaz tại http://eed3si9n.com/

5

Như với bất kỳ dự án mã nguồn mở, câu trả lời chỉ thực sự đúng và có thể chấp nhận để "Tại sao không phải là tài liệu tốt hơn họ?" là "Bởi vì chưa có ai viết nó. Bạn được tự do tình nguyện."

(Tôi thành thật không có ý tưởng cho dù câu trả lời này sẽ cho kết quả upvotes hoặc downvotes. Thí nghiệm Thú vị.)

+10

Tôi nghĩ rằng vấn đề là, bạn không thể viết tài liệu cho một cái gì đó bạn không hiểu. – cdmckay

Các vấn đề liên quan