通过Scalaz找到我的方式

时间:2012-09-12 12:04:17

标签: scala functional-programming scalaz scalaz7

  

可能重复:
  Good scalaz introduction

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

  • FunctorApplicativeMonad特征,
  • 新的monad,例如Validation(编辑:原来它只是一个应用程序)
  • monad变形金刚(OptionTEitherT ....)
  • ItereateeŠ
  • Lens ES
  • ZipperŠ

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

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

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

  

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

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

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

4 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:9)

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

Validation(顺便提一下isn't actually a monad)可能是最好的起点。如果您曾在标准库中使用Either进行验证,那么Validation会感觉既熟悉又方便。您会发现Validation Validation here onStackOverflow的许多有用的讨论。

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

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

Scalaz中有许多其他方便的小工具,您可以使用它而无需掌握整个大局。 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) 是我的最爱之一 - 通过为您提供一种在任何一方映射函数的方法,可以更方便地处理元组:

{{1}}

一旦你对这些概念中的一些有了良好的工作理解,我建议Brent Yorgey的this answer,这是面向Haskell的,但是给你足够的类别理论和抽象代数做了很棒的工作。了解你在Scalaz中找到的大部分内容。

答案 2 :(得分:6)

我觉得有些视频很有用:

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

同样learnread Haskell类型签名并浏览Haskell typeclassopedia

答案 3 :(得分:5)

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

我做了一个名为“scalaz For the Rest of We Us”的演讲,它接近scalaz虽然每个人都熟悉的例子:memoization(scalaz中的备忘录),域验证(scalaz中的验证)等。那样的“用例” “很清楚,可以开始学习如何使用scalaz的力量解决熟悉的问题。