【问题标题】:Why does Scalaz use complex symbols and no in-code documentation?为什么 Scalaz 使用复杂的符号并且没有代码内文档?
【发布时间】:2012-10-20 23:40:49
【问题描述】:

我有时在看 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 验证似乎是最简单的部分,但在那之后呢?

【问题讨论】:

  • 据我所知,大多数特殊符号都有一个冗长的非 unicode 伴侣。 Scalaz 模仿 Haskell,其中许多符号来自 Haskell 领域(所以下一个问题是 why Haskell uses so many symbols)。而且我个人认为 beginner scala 程序员不应该使用 scalaz。
  • @om-nom-nom 我明白了。我说我是 Scala 初学者,这是我的观点,但我正在关注 Coursera 上的 Martin Odersky 课程,阅读这本书,并使用它 3 个月,以构建一个即将投入生产的真实世界 web 应用程序.我只是想知道我什么时候应该尝试使用/理解 Scalaz,因为在我不理解它之前,我会一直认为自己是 Scala 初学者:)
  • scalaz 与 shapeless 处于同一水平,可能下一次在 Scala 中会有一个用于详尽宏编程的库。所有这些部分都在一起,它们不是 Scala 用户核心的一部分——它们是证明什么是可能的以及如何抽象到新级别的实验。可以说他/她是高级 Scala 程序员,但无法理解 Scala 的高阶部分——这也是 Odersky 在他的Scala levels 中所说的。
  • 尽管如此,学习 Scala 比学习命令式语言需要更多的时间——如果一个人还没有使用另一种函数式语言的经验的话。就我而言,我认为我在 9 或 10 个月后达到了高级 Scala 程序员水平(并且每天使用 Scala 工作几个小时)——但我之前没有任何函数式编程经验。
  • @om-nom-nom 符号可能有冗长的伴侣,但是当代码使用符号时,那有什么好处。我不是天生就有一个 scalaz 符号来命名映射。你如何从寻找一个符号到弄清楚它应该做什么?我发现克隆 repo 并应用 grep 会有所帮助。

标签: scala scalaz


【解决方案1】:

我同意 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, 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 符号。

【讨论】:

    【解决方案2】:

    一个起点是阅读Learn You a Haskell,它涵盖了许多概念。

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

    从 Manning 那里获得一份由 scalaz 的作者编写的 Scala 函数式编程的副本。

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

    我想说从 scalaz 开始比验证更容易,这是对 Option 的各种丰富,例如 ~foo 它返回选项中包含的值或选项类型的“零”(数字为 0,字符串等的空字符串)。

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我认为问题是,你不能为你不理解的东西写文档。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-07
      • 1970-01-01
      • 2019-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多