繁体   English   中英

函数式编程中的代数结构是什么?

[英]What are algebraic structures in functional programming?

我一直在对函数式编程的概念和想法进行一些轻松的阅读。 到目前为止,很好,我已经阅读了三个主要概念:代数结构、类型类和代数数据类型。 我对什么是代数数据类型有很好的理解。 我认为 sum 类型和 product 类型相当简单。 例如,我可以想象创建一个代数数据类型,如Card类型,它是一种产品类型,由两个枚举类型组成, Suit (具有四个值和符号)和Rank (具有 13 个值和符号)。

然而,我仍然试图准确地理解代数结构和类型类是什么。 我的脑子里只有一个表面层次的图景,但不能完全把我的头包起来,例如,不同类型的代数结构,如函子、幺半群、单子等。这些到底有什么不同? 如何在编程环境中使用它们? 类型类与常规类有何不同? 谁能至少指出我关于抽象代数和函数式编程的好书的方向? 有人建议我学习 Haskell,但我真的需要学习 Haskell 才能理解函数式编程吗?

“代数结构”是一个远远超出编程的概念,它属于数学。

想象一下所有可能的数学对象深不可测的深海。 每个条纹的数字(自然实数p-adic数...)都在那里,但也有字母序列、图形几何图形的对称性以及它们之间所有明确定义的变换和映射。 还有很多。

通过指定条件,我们可以尝试在这片海域“撒网”,只保留其中的一些实体。 就像“事物的集合,其中有一个操作将其中两个事物组合成相同类型的第三个事物,并且该操作是关联的”。 我们可以给这些条件命名,比如“半群” (因为我们谈论的是高度抽象的东西,所以选择一个描述性的名字是很困难的。)

这遗漏了数学“海洋”的许多居民,但描述仍然适合他们中的很多人! 许多事物的集合都是半群。 例如,具有乘法运算的自然数,以及具有串联的非空字母列表,或具有组合的正方形对称性

您可以使用额外条件扩展您的描述。 就像“一个半群,还有一个元素,它与任何其他元素组合得到另一个元素,不变”。 这限制了符合描述的数学实体的数量,因为您需要更多的数学实体。 一些有效的半群将缺少那个“中性元素” 但是很多数学实体仍然会满足扩展的描述。 如果您不小心,您可以声明条件如此严格,以至于没有可能的数学实体实际上适合它们! 在其他时候,您可以精确到只有一个实体适合它们。

纯粹使用数学实体的这些描述,仅使用我们需要它们的一般属性,我们可以获得关于它们的意外结果,乍一看并不明显,结果将适用于所有符合描述的实体。 将这些发现视为“代码重用”的数学等价物。 例如,如果我们知道某些事物的集合是一个半群,那么我们可以使用二进制取幂来计算指数,而不是将事物与自身结合n次。 但这仅适用于半群运算的关联特性

你在这里问了很多问题,但我可以尽量回答它们:

... 不同类型的代数结构,如函子、幺半群、单子等。这些到底有什么不同? 如何在编程环境中使用它们?

这是学习 Haskell 时很常见的一个问题。 我不会在这里写另一个答案——无论如何,一个完整的答案相当长——但是一个简单的谷歌搜索给出了一些非常好的答案:例如,我可以推荐1 2 3

类型类与常规类有何不同?

(通过“常规课程”,我假设您的意思是在 OOP 中找到的课程。)

这是另一个常见问题。 基本上,除了名字之外,两者几乎没有任何共同之处。 OOP 中的字段方法的组合。 通过创建该类的实例来使用类; 每个实例都可以在其字段中存储数据,并使用其方法操作该数据。

相比之下,类型类只是函数的集合(通常也称为方法,尽管几乎没有联系)。 您可以通过为该类型重新定义该类的每个方法来声明该数据类型的类型类的实例(同样,没有连接),之后您可以使用该类型的方法。 例如, Eq类如下所示:

class Eq a where
    (==) :: a -> a -> Bool
    (/=) :: a -> a -> Bool

并且您可以通过实现每个函数来定义该类的一个实例,例如Bool

instance Eq Bool where
    True == True   = True
    False == False = True
    _ == _         = False

    p /= q = not (p == q)

谁能至少指出我关于抽象代数和函数式编程的好书的方向?

我必须承认我对此无能为力(无论如何,它与 Stack Overflow 无关)。

有人建议我学习 Haskell,但我真的需要学习 Haskell 才能理解函数式编程吗?

不,你没有——你可以从任何函数式语言中学习函数式编程,包括 Lisp(特别是 Scheme 方言)、OCaml、F#、Elm、Scala 等。 Haskell 恰好是一种特别“纯”的函数式编程语言,我会也推荐它,但如果你只是想学习和理解函数式编程,那么任何一种都可以。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM