在Scalaz找到我的路

在Scalaz找到我的路,scala,functional-programming,scalaz,scalaz7,Scala,Functional Programming,Scalaz,Scalaz7,可能重复: 我想了解更多关于Scalaz的信息,可能是使用Scalaz7来避免大脑在宣布稳定后重新布线。我的问题是Scalaz包含很多功能。虽然它的大部分都是独立于其他部分的,但我想从鸟瞰的角度了解Scalaz提供的全球功能以及它是如何组织的。据我所知,Scalaz提供了 Functor,Applicative和Monad特征 新的monad,如验证(编辑:原来它只是一个应用程序) monad变压器(option,EitherT…) itereates 镜头es 拉链s 除此之外,还有许多

可能重复:

我想了解更多关于Scalaz的信息,可能是使用Scalaz7来避免大脑在宣布稳定后重新布线。我的问题是Scalaz包含很多功能。虽然它的大部分都是独立于其他部分的,但我想从鸟瞰的角度了解Scalaz提供的全球功能以及它是如何组织的。据我所知,Scalaz提供了

  • Functor
    Applicative
    Monad
    特征
  • 新的monad,如
    验证
    (编辑:原来它只是一个应用程序)
  • monad变压器(
    option
    EitherT
    …)
  • itereate
    s
  • 镜头
    es
  • 拉链
    s
除此之外,还有许多隐式转换和新的构造函数,例如
一些
,它们与标准库重叠,但在类型方面表现更好

:type Some(3) // Some[Int]
:type some(3) // Option[Int]
我基本掌握了这些结构中的大部分,但我对其中的任何概念都不太流利

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

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


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

我推荐Eugene Yokota在Scalaz 7上的优秀系列。作者遵循了本文的结构。这种方法是系统的,非常具有教育性。

我发现一些视频很有用:

  • 而且
  • (5部分)
  • 而且
其中大多数都有很棒的幻灯片,如果你是铁杆,那么就不用看视频来阅读


此外,要键入签名并浏览。

我的建议是,不要等到您觉得自己对库有了更高层次的了解,只需选择一些工具开始,然后按照概念链接进行操作

验证
(顺便说一下)可能是最好的开始。如果您曾经在标准库中使用过
进行验证,
验证
会让您感到既熟悉又方便。您将发现许多关于验证和的有用讨论

一旦您熟悉了
验证
,您就应该对applicative functor类型类有很好的基本了解,这在许多其他上下文中都很有用

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)
scala>导入scalaz.\uz,scalaz_
进口scalaz_
进口Scalaz_
scala>def inc(i:Int)=i+1
公司:(i:Int)Int
scala>def repeat(n:Int)(s:String)=s*n
重复:(n:Int)(s:String)String
scala>(inc())重复(3)
res0:(Int,String)=(2,aaa)

一旦你对其中的一些概念有了很好的理解,我建议布伦特·约基的,它是面向哈斯凯尔的,但在给你足够的范畴理论和抽象代数来理解Scalaz中的大部分内容方面做得非常好。

尽管我决不会让任何人离开哈斯凯尔教程,如果你是一个OOP风格的开发人员,并且不熟悉为什么你想要生活在一个功能性的世界中,那么它们可能有点令人难以置信

我做了一个名为“为我们其他人准备的scalaz”的演讲,这个演讲接近scalaz,尽管每个人都熟悉一些例子:备忘录化(scalaz中的备忘录)、域验证(scalaz中的验证),等等。这样,“用例”就很清楚了,可以开始学习如何使用scalaz的功能解决熟悉的问题

  • 幻灯片:
  • scalaz“入门”备忘单:

类似的问题:只是一句话:验证不是单子,
只是
一个应用函子(在scalaz7中,它甚至没有平面图),我非常了解分类理论和抽象代数(我有代数地理测量研究的背景),所以这不是我的问题。我还熟悉函数编程环境中的单子、函子等。我的问题与编程更相关。例如,假设我想学习验证。我在哪里进口?我有什么办法?等等当然,我可以阅读资料来源或在shell中使用inspection,但是如果有一个类似于地图的东西,它会很有用。对不起,你的背景不是很清楚。在这种情况下,通过源代码挖掘可能是你最好的选择,因为没有那么多,一旦你选择了一些约定(类型la),它就相当清楚了