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

标签 haskell functional-programming typeclass algebraic-data-types abstract-algebra

我一直在对函数式编程概念和想法进行一些简单的阅读。到目前为止,非常好,我已经阅读了三个主要概念:代数结构、类型类和代数数据类型。我对什么是代数数据类型有相当好的理解。我认为总和类型和产品类型相当简单。例如,我可以想象创建一个像 Card 这样的代数数据类型。 type 是由两个枚举类型组成的产品类型,Suit (有四个值和符号)和Rank (有 13 个值和符号)。
但是,我仍然对试图准确理解代数结构和类型类是什么感到不满。我脑子里只有一个表面层次的画面,但不能完全理解,例如,不同类型的代数结构,如仿函数、幺半群、单子(monad)等。这些到底有什么不同?它们如何在编程环境中使用?类型类与常规类有何不同?谁能至少给我指出一本关于抽象代数和函数式编程的好书的方向?有人建议我学习 Haskell,但我真的需要学习 Haskell 才能理解函数式编程吗?

最佳答案

"algebraic structure"是一个远远超出编程的概念,它属于数学。
想象一下所有可能的数学对象深不可测的深海。每个条纹的数字(naturalsrealsp-adic 数字...),还有字母序列,graphs , trees , symmetries of geometrical figures ,以及它们之间的所有定义明确的转换和映射。还有很多。
我们可以尝试通过指定条件,向这片海域“撒网”,只保留其中的一些实体。就像“事物的集合,其中有一个操作将其中两个事物组合成相同类型的第三个事物,并且该操作是关联的”。我们可以给这些条件起自己的名字,比如,"semigroup" . (因为我们谈论的是高度抽象的东西,所以很难选择一个描述性的名称。)
这忽略了数学“海洋”的许多居民,但描述仍然适合他们中的很多人!许多事物的集合是半群。例如,带有乘法运算的自然数,以及带有连接的非空字母列表,或 symmetries of a square with composition .
您可以使用额外的条件扩展您的描述。就像“一个半群,还有一个元素,它与任何其他元素相结合得到另一个元素,不变”。这限制了符合描述的数学实体的数量,因为您需要更多的数学实体。一些有效的半群将 lack"neutral element" .但是很多数学实体仍然会满足扩展描述。如果你不小心,你可以声明条件如此严格,以至于没有任何可能的数学实体能够真正适合它们!在其他时候,您可以精确到 only one实体适合他们。
纯粹使用这些数学实体的描述,仅使用我们需要的一般属性,我们可以获得unexpected results关于它们,乍一看并不明显,结果将适用于所有符合描述的实体。将这些发现视为“代码重用”的数学等价物。例如,如果我们知道某些事物的集合是半群,那么我们可以使用 binary exponentiation 计算指数。而不是繁琐地将事物与自身结合n次。但这仅适用于 associative property的半群操作。

关于haskell - 函数式编程中的代数结构是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63655414/

相关文章:

haskell - 为什么 Haskell 在读取 Num 时似乎默认读取 Int?

haskell - IO 操作的惰性评估

haskell - 如何在本地使用hoogle(如ctags)?

javascript - 使用 Reduce 将数组转换为对象

functional-programming - 找个小项目做个函数式编程的介绍

haskell - 如果类实例可用,则使用专门的实现

scala - Haskell 中类型类的目的与 Scala 中特征的目的

haskell - 将字符串列表连接到一个字符串 haskell

haskell - 在 Haskell 中结合 ST 和 List 单子(monad)

javascript - angular.identity() 有什么用例的好例子吗?