24

可能重复:
好的scalaz介绍

我想了解更多关于 Scalaz 的信息,可能使用 Scalaz7 来避免在宣布稳定后重新连接我的大脑。我的问题是 Scalaz 包含很多功能。虽然其中大部分是独立于其他部分的,但我想对 Scalaz 提供的全局功能及其组织方式有一个鸟瞰图。据我所知,Scalaz 提供了,除其他外,

  • Functor,ApplicativeMonad特征,
  • 新的单子,例如Validation(编辑:原来它只是一个应用程序)
  • monad 转换器 ( OptionT, EitherT....)
  • Itereatees
  • Lenses
  • Zippers

除此之外,还有很多隐式转换,以及新的构造函数,例如some与标准库重叠但在类型方面表现更好

:type Some(3) // Some[Int]
:type some(3) // Option[Int]

我对这些结构中的大多数都有基本的掌握,但我对任何概念都不流利。

您对学习库的顺序有什么建议,模块之间存在哪些逻辑依赖关系?更一般地说,我在哪里可以找到图书馆的高级概述?

编辑似乎大多数答案都是针对学习函数式编程的基本组成部分,比如单子,所以我会尝试更精确。我有 Haskell 的基本知识和数学家背景,所以我的问题与范畴论或基本函数式编程无关。

我的问题是 Scalaz 是一个巨大的库。我不知道在哪里可以找到什么,哪些方法对各种数据类型可用或有用。例如,我真正需要的是一张地图,它会告诉我,当我想要迭代需要处理的资源时,我可能想要考虑迭代对象以及我可以用它做什么类型的操作。更像是图书馆可用功能的全景。

4

4 回答 4

11

我会推荐 Eugene Yokota 在 Scalaz 7 上的优秀系列Learning scalaz。作者遵循Learn You a Haskell for Great Good的结构。这种方法是系统的,非常具有教学性。

于 2012-09-12T13:12:04.107 回答
9

我的建议是不要等到你觉得你对图书馆有一个高层次的理解——只需选择几个工具开始,然后在你去的时候遵循概念链接。

Validation(顺便说一句,它实际上不是 monad)可能是最好的起点。如果您曾经Either在标准库中使用过验证,Validation会感觉既熟悉又方便得多。您会ValidationStackOverflow其他地方找到很多有用 讨论

一旦您熟悉了工作,Validation您应该对应用函子类型类有一个很好的基本了解,这在许多其他情况下很有用。

Monoid是另一个很好的起点。这是一个非常简单的类型类(本质上只是一个类似关联的加法运算和一个标识元素),一旦你理解了它,你就会到处看到幺半群。例如,请参阅此答案(完全披露:由我撰写),展示如何使用 monoids 来解决最初可能看起来不是很单一的问题。

Scalaz 中还有许多其他方便的小工具,您可以使用它们而无需掌握整个大局。Bifunctor是我的最爱之一——它为您提供了一种在任一侧映射函数的方法,从而使使用元组更加方便:

scala> import scalaz._, Scalaz._
import scalaz._
import Scalaz._

scala> def inc(i: Int) = i + 1
inc: (i: Int)Int

scala> def repeat(n: Int)(s: String) = s * n
repeat: (n: Int)(s: String)String

scala> (inc(_)) <-: (1, "a") :-> repeat(3)
res0: (Int, String) = (2,aaa)

一旦您对其中一些概念有了很好的理解,我建议您使用 Brent Yorgey 的Typeclassopedia,它是面向 Haskell 的,但在为您提供足够的范畴理论和抽象代数以理解您的大部分内容方面做得非常出色可以在 Scalaz 中找到。

于 2012-09-12T13:18:54.467 回答
6

我发现一些有用的视频:

其中大多数都有很棒的幻灯片,如果你是铁杆,那么在没有视频的情况下阅读它们。

还要学习阅读Haskell类型签名并浏览Haskell 类型分类百科

于 2012-09-12T13:14:01.437 回答
5

虽然我永远不会让任何人远离 Haskell 教程,但如果你是一个 OOP 风格的开发人员并且不熟悉你为什么想要生活在一个函数式世界中,那么它们可能会有点令人难以置信。

我做了一个名为“scalaz For the Rest of Us”的演讲,它通过每个人都熟悉的例子来接近 scalaz:记忆化(scalaz 中的备忘录)、域验证(scalaz 中的验证)等。这样“用例”就很清楚了并且可以开始学习如何使用 scalaz 的力量来解决熟悉的问题。

于 2012-09-12T19:31:53.027 回答