函数式编程中除了单子之外,是否还使用任何代数结构?

17

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

但是当我遇到单子Monad时,它使用了一个名为幺半群Monoid的代数结构,我感到惊讶和高兴,因为我一直在数学中学习的理论知识被应用于编程。

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

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

此致敬礼, ciun


这不完全是您要寻找的东西,但在《单子阅读者》第13期的文章《The Typeclassopedia》中(http://www.haskell.org/wikiupload/8/85/TMR-Issue13.pdf)可能仍然很有趣:它是对Haskell预定义的几个类型类(`Functor`, Applicative, Monoid, Monad, Arrow等)进行详细解释。 - stakx - no longer contributing
3个回答

11

你可以建模很多结构。这里是一组:

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的数字层次结构不幸地建模不良,但有numeric prelude试图解决这个问题。还有DoCon把它带到了极致。关于类型类的旅游(主要受范畴论的推动),有Typeclassopedia,其中包含大量的示例和应用。

4

Haskell的箭头是单子的一种泛化,可能与编程有关。


3
我建议阅读Edward Kmett的易于理解的博客和相关的extras类别包。这应该能够让你忙碌几年。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接