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

时间:2012-10-20 23:40:49

标签: 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 
  }

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

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

为什么他们使用这么多人无法阅读的运营商? 我甚至不知道如何在没有复制/粘贴的情况下键入。这只是一个例子,因为有很多。

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

3 个答案:

答案 0 :(得分:13)

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

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

让我们来看看你的例子:如果你知道Kleisli categories以及每个monad如何产生一个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)

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

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

答案 1 :(得分:7)

一个开始的地方是阅读“了解你是一个涵盖许多概念的Haskell”。

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

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

我的博客http://www.casualmiracles.com/blog/

上有几个小例子

我想说scalaz比验证更容易开始,这就是像~foo这样的选项的各种丰富,它返回选项中包含的值或者选项类型的'0'(数字为0, String等的空字符串)。

我在http://eed3si9n.com/

忘记了一系列非常详细的文章,名为Learning Scalaz

答案 2 :(得分:5)

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

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