为什么Scalaz使用复杂符号而不使用代码内文档?

Seb*_*ber 25 scala scalaz

我有时会看Scalaz并发现很难理解初学者Scala程序员.

  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 
  }
Run Code Online (Sandbox Code Playgroud)

Scalaz方法对于有经验的函数式程序员来说似乎是显而易见的,但对于其他任何人来说,它很难理解.

为什么Scalaz代码中的文档很少?

他们为什么要使用那么多大多数人都无法阅读的运营商?我甚至不知道如何键入??不复制/粘贴.这只是一个例子,因为有很多.

有人说Scalaz在开始时是不可读的,但2年后他们发现它很棒.我想知道从哪里开始Scalaz.Scala验证似乎是最简单的部分,但之后呢?

Pet*_*lák 13

我同意Scalaz大多没有证件.问题在于它从Haskell(以及基础数学)中收集了许多高级概念,并且详细记录它们将成为一本关于函数式编程(和数学)的全书.所以我相信Scalaz的方法是:

  • 如果你知道并需要为Scala准备的函数式编程的一些概念,你很可能会在这里找到它.
  • 如果你不知道,你将不得不在其他地方学习它.

让我们来看看你的例子:如果你知道Kleisli类别以及每个monad如何产生一个,那么这个定义是完全独立的.如果你不这样做,那么KleisliCategory对你没用.

(根据我的经验,Haskell更适合从函数式编程中学习高级概念.虽然Scala远比Java好,但它仍然拖延了Java的OO /命令式遗产,使得事情变得混乱.)


考虑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)
Run Code Online (Sandbox Code Playgroud)

如果你愿意,你可以不用它们.

不过,我不确定在Scalaz中使用它们是不是一个好主意.对于缺少正确字体的人来说,这可能会使代码无法读取.我宁愿选择纯ASCII符号.


Cha*_*ton 7

一个开始的地方是阅读Learn You a Haskell,其中涵盖了许多概念.

观看Chris Marshall(@oxbow_lakes)scalaz演讲:http://skillsmatter.com/expert/scala/chris-marshall

获取scalaz的一些作者撰写的Manning Scala中的函数编程副本.

我的博客上有几个小例子http://www.casualmiracles.com/blog/

我会说scalaz比验证更容易开始,这就是选项的各种丰富,如~foo,它返回选项中包含的值或选项类型的"零"(数字为0,空字符串为字符串等).

我在http://eed3si9n.com/上忘记了一系列非常详细的文章,名为Learning Scalaz


Dav*_*ith 5

与任何开源项目一样,"为什么不是更好的文档?"这是唯一真实可接受的答案.是"因为还没有人写过它.你可以自由地做志愿者."

(老实说,我不知道这个答案是否会导致赞成票或票数.有趣的实验.)

  • 我认为问题是,你不能为你不理解的东西编写文档. (11认同)