为什么Scalaz使用复杂符号而不使用代码内文档?
我有时会看Scalaz并发现很难理解初学者Scala程序员。
implicit def KleisliCategory[M[_]: Monad]: Category[({type λ[α,β]=Kleisli[M,α,β]})#λ] = new Category[({type λ[α,β]})#λ] { def id[A] = ☆(_ η) def compose[X,Y,Z](f: Kleisli[M,Z],g: Kleisli[M,X,Y]) = f <=< g } implicit def CokleisliCategory[M[_]: Comonad]: Category[({type λ[α,β]=Cokleisli[M,β]})#λ] { def id[A] = ★(_ copure) def compose[X,Z](f: Cokleisli[M,g: Cokleisli[M,Y]) = f =<= g } Scalaz方法对于有经验的函数式程序员来说似乎是显而易见的,但对于其他任何人来说,它很难理解。 为什么Scalaz代码中的文档很少? 为什么他们使用这么多人无法阅读的操作符呢? 有些人说Scalaz在开始时是不可读的,但2年后他们发现它很棒。 解决方法
我同意Scalaz大多没有证件。问题在于它从Haskell(以及基础数学)中收集了许多高级概念,并且详细记录它们将成为一本关于函数式编程(和数学)的全书。所以我相信Scalaz的方法是:
>如果你知道并需要为Scala准备的函数式编程的一些概念,你很可能会在这里找到它。 让我们来看看你的例子:如果你知道Kleisli categories以及每个monad如何产生一个,那么这个定义是非常独立的。如果你不这样做,那么KleisliCategory对你毫无用处。 (根据我的经验,Haskell更适合从函数式编程中学习高级概念。虽然Scala远比Java好,但它仍然拖延了Java的OO /命令式遗产,这会使事情变得混乱。) 考虑Unicode符号。看看来源似乎它们只被用作语法糖或者至少它们具有非Unicode对应物: def ☆[M[_],A,B](f: A => M[B]): Kleisli[M,B] = kleisli(f) def η[F[_]](implicit p: Pure[F]): F[A] = pure def cokleisli[W[_],B](f: W[A] => B): Cokleisli[W,B] = ★(f) 如果你愿意的话,你可以不用它们。 不过,我不确定在Scalaz中使用它们是不是一个好主意。对于缺乏正确字体的人来说,这可能会使代码无法读取。我宁愿选择纯ASCII符号。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |