我有时会看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验证似乎是最简单的部分,但之后呢?
答案 0 :(得分:13)
我同意Scalaz大多没有证件。问题在于它从Haskell(和基础数学)中收集了许多高级概念,并且详细记录它们将成为一本关于函数式编程(和数学)的全书。所以我相信Scalaz的方法是:
让我们来看看你的例子:如果你知道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等的空字符串)。
忘记了一系列非常详细的文章,名为Learning Scalaz答案 2 :(得分:5)
与任何开源项目一样,“为什么不是更好的文档?”这是唯一真实可接受的答案。是“因为还没有人写过它。你可以自由地做志愿者。”
(老实说,我不知道这个答案是否会导致赞成票或赞成票。有趣的实验。)