通过Scalaz找到我的方式

And*_*rea 24 functional-programming scala scalaz scalaz7

可能重复:
好的scalaz介绍

我想了解更多有关Scalaz的信息,可能会使用Scalaz7来避免在声明稳定后重新布线.我的问题是Scalaz包含很多功能.虽然大部分内容都是独立于其他部分,但我希望能够全面了解Scalaz提供的全局功能以及它的组织方式.据我所知,Scalaz除其他外提供了

  • Functor,ApplicativeMonad特征,
  • 新的monad如Validation(编辑:原来它只是一个应用)
  • monad变形金刚(OptionT,EitherT....)
  • Itereatee小号
  • LensES
  • Zipper小号

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

:type Some(3) // Some[Int]
:type some(3) // Option[Int]
Run Code Online (Sandbox Code Playgroud)

我对大多数这些结构有基本的把握,但我对任何概念都不熟悉.

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

编辑似乎大多数答案都是针对学习函数式编程的基本组件,比如monad,所以我会尝试更精确.我有Haskell的基本知识和数学家背景,所以我的问题与类别理论或基本函数式编程无关.

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

par*_*tic 11

我会推荐Eugene Yokota在Scalaz 7上的优秀系列学习学习scalaz.作者遵循了学习你是一个很好的Haskell的结构.这种方法是系统的,非常教学的.

  • @EugeneYokota我无法使用Scalaz 7找到正确的导入(除非我导入所有内容).你能补充一点最小进口吗? (3认同)

Tra*_*own 9

我的建议是不要等到你对图书馆有一个高层次的了解 - 只需选择几个工具开始,然后按照概念链接进行操作.

Validation(顺便说一下,它实际上不是一个单子)可能是最好的起点.如果您曾经Either在标准库中使用过验证,那么Validation会感觉既熟悉又方便.你会发现很多有用的讨论Validation在这里 StackOverflow的其他地方.

一旦你习惯了,Validation你应该对应用函子类型类有一个很好的基本理解,这在许多其他环境中都很有用.

Monoid是另一个很好的起点.这是一个非常简单的类型类(基本上只是一个关联的类似操作和一个标识元素),一旦你理解它,你会看到到处都是幺半群.例如,请参阅此答案(完整披露:由我来),展示如何使用幺半群来解决最初可能看起来不太常见的问题.

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)
Run Code Online (Sandbox Code Playgroud)

一旦你对这些概念中的一些有了很好的理解,我就建议使用Brent Yorgey的Typeclassopedia,这是面向Haskell的,但它能为你提供足够的类别理论和抽象代数来理解你的大部分内容.我会在Scalaz找到.


ron*_*ron 6

我觉得有些视频很有用:

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

学习阅读Haskell的类型签名和浏览哈斯克尔typeclassopedia.


Ada*_*ien 5

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

我给出了一个名为"scalaz For the Rest of We Us"的演讲,它通过每个人都熟悉的例子来处理scalaz:memoization(scalaz中的备忘录),域验证(scalaz中的验证)等.这样的"用例"很清楚并且可以开始学习如何使用scalaz的力量解决熟悉的问题.