Ara*_*h S 1 haskell functor category-theory
haskell中的所有类别(Monoid,Functor,Monad等)都有相应的法则,实例必须满足这些法律才能保证类别按预期工作.我无法理解的是,如何为一个类别选择特定的法律?例如,为仿函数选择id和组合法则的原因是什么?
leftaroundabout校正您的术语了一点,但阐述:一类在类别的理论是,由对象的抽象,这些对象,并且以组成这些转换(其中该组合物是可结合的能力)之间的变换.我们并不经常在haskell中讨论类别本身,但是我们使用的一些抽象来自类别理论,我们所讨论的是或多或少地生活在我们称之为Hask的类别中.Control.Category中有类别抽象的表示; 这是一个更通用的版本.(.)
但我现在会忘记称为类别的抽象.要了解的重要一点是,我们表达喜欢抽象的方式类别中Haskell是与类型类.
你问为什么法律是他们的方式.良好抽象的标志是它足够通用,可以广泛应用,同时仍然给我们一些有用的东西.
我认为这Monoid是最好的例子.列表,集合,关于加法(和相对于乘法)的整数,从事物到幺半群等的函数都形成一个幺半群:我们可以定义实现mempty并mappend满足您可以在这里阅读的规则,所以它显然广泛适用.
但法律给了我们什么?法律允许我们编写更有用的代码,这些代码在选择monoid时是通用的.例如,知道mappend是关联的,我们可以定义一个:
mconcat :: [a] -> a
Run Code Online (Sandbox Code Playgroud)
而且我们的用户不需要关心这是用一个foldr还是一个foldl或其他东西来实现的.这也意味着编译器可以根据上下文自由选择折叠的最佳顺序.我们有一个标识对象的事实意味着可以在空列表上安全地调用此函数.
幺星定律在分布式计算的上下文中也是必不可少的,例如,你有map-reduce模式,其中monoidal reduce操作可以在你的分布式"列表"上自由地并行应用.
因此,当你放弃法律时,你会得到一些不太有用的东西.但为什么这些法律呢?我认为简单的答案是因为人们发现它们很有用.情况也是如此,放松或删除法律可以创造更一般的东西,也可以在不同的环境中使用.例如在haskell中我们有Semigroup类,或者在数学中你有非欧几里德几何.