功能编程中有很多模式。例如Monoids,Monads,Functors e.t.c但这些都是非常高级的抽象,并且我们真的不知道何时使用哪一个。
e.g。当你想将A的几个项目减少到A
的单个项目时,Monoids非常有用从这个意义上讲,这些抽象试图解决的问题是什么?
也许我们可以通过使用monoid
monoid
被发现之前如何处理问题以及他们如何处理同一问题
答案 0 :(得分:3)
那些模式是数学概念,它们要么适用于您的程序,要么不适用于您的程序。您可以在没有它们的情况下编写完全相同的代码,您将开始注意到,针对不同数据类型的许多函数共享一个共同的结构。
您不仅需要为每种数据类型使用不同的函数来处理这种常见问题,而且还需要为每种数据类型重写所有辅助函数。这是当你发现你想要使用抽象时。您检查哪个类型类与公共结构匹配并提供预期的帮助函数,然后将其应用于您的数据类型。
关于您的具体示例:在“{3}}被发现”之前,每个人都使用++
附加两个列表,concat
附加多个列表。同样,他们使用+
对两个数字求和,并sum
对多个数字求和。如果有人写了一个树,其元素应该折叠成单个值,他必须使用相应的操作为列表编写一个实现,并为数字编写一个实现。
现在,使用monoids,我们可以抽象出具体类型,并为任意幺半群编写树实现。我们使用mappend
和mconcat
操作而不是特定操作,我们的树适用于列表和数字。还有任何其他幺半群。