我有时会看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的方法是:
让我们来看看你的例子:如果你知道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符号.
一个开始的地方是阅读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
与任何开源项目一样,"为什么不是更好的文档?"这是唯一真实可接受的答案.是"因为还没有人写过它.你可以自由地做志愿者."
(老实说,我不知道这个答案是否会导致赞成票或票数.有趣的实验.)
| 归档时间: |
|
| 查看次数: |
2279 次 |
| 最近记录: |