17

我最近开始了解函数式编程(在 Haskell 和 Scala 中)。它的功能和优雅非常迷人。

但是当我遇到使用名为 Monoid 的代数结构的 Monads 时,我很惊讶也很高兴看到我从数学中学到的理论知识被用于编程。

这个观察让我想到了一个问题:群、域或环(其他请参见代数结构)可以在编程中用于更多抽象和代码重用目的并实现类似数学的编程吗?

据我所知,名为Fortress的语言(一旦编译器完成,我肯定会更喜欢任何语言)在其库代码中定义了这些结构。但到目前为止我看到的唯一用途是我们已经熟悉的数字类型。它们还有其他用途吗?

最好的问候, ciun

4

3 回答 3

10

您可以为许多结构建模。这是一组:

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 (Dual CAB, 5) (Dual CBA, 1)并获得结果。这将是组 S 3 * ⨯ Z 中的计算。您可以添加其他组,以任何可能的方式组合它们并与它们进行计算。

类似的事情可以用环、字段、排序、向量空间、类别等来完成。不幸的是,Haskell 的数字层次结构模型很糟糕,但是有一个数字前奏 试图解决这个问题。还有将它发挥到极致的DoCon 。对于类型类之旅(主要受范畴论启发),有Typeclassopedia ,其中包含大量示例和应用程序。

于 2010-07-26T12:30:53.957 回答
4

Haskell's Arrows是单子的概括,可能是相关的。

于 2010-07-25T22:46:52.747 回答
3

我推荐 Edward Kmett 的可读性很强的博客和相关类别的附加包。应该让你忙碌多年。

于 2011-11-01T22:06:44.667 回答