Functional programming 除了幺半群之外,函数式编程中还有其他代数结构吗?
我最近开始了解函数式编程(在Haskell和Scala中)。它的功能和优雅是相当迷人的 但是当我遇到Monads时,它使用了一种叫做Monoid的代数结构,我很惊讶,也很高兴看到我从数学中学到的理论知识在编程中得到了应用 这个观察给我带来了一个问题:在编程中是否可以使用组、字段或环(其他请参见)来实现更多的抽象和代码重用目的,并实现类似数学的编程 据我所知,名为的语言(在编译完成后,我肯定会优先于任何语言)在其库代码中定义了这些结构。但到目前为止,我看到的唯一用途是数字类型,我们已经很熟悉了。它们还有其他用途吗 致以最良好的祝愿,Functional programming 除了幺半群之外,函数式编程中还有其他代数结构吗?,functional-programming,algebraic-data-types,fortress,abstract-algebra,Functional Programming,Algebraic Data Types,Fortress,Abstract Algebra,我最近开始了解函数式编程(在Haskell和Scala中)。它的功能和优雅是相当迷人的 但是当我遇到Monads时,它使用了一种叫做Monoid的代数结构,我很惊讶,也很高兴看到我从数学中学到的理论知识在编程中得到了应用 这个观察给我带来了一个问题:在编程中是否可以使用组、字段或环(其他请参见)来实现更多的抽象和代码重用目的,并实现类似数学的编程 据我所知,名为的语言(在编译完成后,我肯定会优先于任何语言)在其库代码中定义了这些结构。但到目前为止,我看到的唯一用途是数字类型,我们已经很熟悉了。它
ciunHaskell's是单子的一种推广,可能与之相关。您可以对许多结构进行建模。以下是一组:
class Group a where
mult :: a -> a -> a
identity :: a
inverse :: a -> a
instance Group Integer where
mult = (+)
identity = 0
inverse = negate
-- S_3 (group of all bijections of a 3-element set)
data S3 = ABC | ACB | BAC | BCA | CAB | CBA
instance Group S3 where
mult ABC x = x
... -- some boring code
identity = ABC
inverse ABC = ABC
... -- remaining cases
-- Operations on groups. Dual:
data Dual a = Dual { getDual :: a }
instance Group a => Group (Dual a) where
mult (Dual x) (Dual y) = Dual (mult y x)
identity = Dual identity
inverse (Dual x) = Dual (inverse x)
-- Product:
instance (Group a, Group b) => Group (a,b) where
mult (x,y) (z,t) = (x `mult` z, y `mult` t)
identity = (identity, identity)
inverse (x,y) = (inverse x, inverse y)
现在,您可以编写mult(双驾驶室,5)(双CBA,1)
并获得结果。这将在S3组中进行计算*⨯ Z.您可以添加其他组,以任何可能的方式组合它们,并使用它们进行计算
环、字段、排序、向量空间、类别等也可以做类似的事情。不幸的是,Haskell的数字层次结构建模不好,但有人试图解决这个问题。还有一个极端的例子。对于类型类之旅(主要由范畴理论推动),有一个包含大量示例和应用程序的列表。我推荐Edward Kmett的非常可读且相关的软件包。这可能会让你忙上好几年。这并不完全是你想要的,但《Typeclassopedia》中的文章可能仍然很有意思:它是哈斯克尔前奏曲中几个类型类(
Functor
,Applicative
,Monoid
,Arrow
)的详细解释。