2

根据维基百科对自由对象的定义,在我看来,Hask 中的每个 Functor 都是免费的。相反,每个自由对象也应该是一个 Functor。这是正确的,还是我误解了?

4

1 回答 1

3

我不确定你是什么意思。通常,在函数式编程上下文中,分类定义的写法比人们想要的更通用。与其使用使用具体类别的 wikipedia 定义,不如考虑您获得的定义,您将想要免费的事物类型作为参数。

定义:免费foo类型上 的自由foo是一个T对象FT,例如foo,以及一个函数,使得任何其他foo和那里的函数都存在一个唯一的foo 态射,使得.Fi :: T -> FT Sf :: T -> S f'f' . i = f

插入说“monoid”,你会得到自由的幺半群,群,你会得到自由群,等等。注意,这个定义基本上没有使用范畴论,而且肯定不会谈论函子。它不像维基百科给出的定义那么正式,但应该直观地工作。给定这个定义,自由构造是制造自由对象的一般方式。例如[],为幺半群提供了一个自由构造,即所有[a]的自由幺半群。aa

我不认为所有函子都是自由函子。我也不认为 Hask 中的所有自由结构都是Haskell函子(所有自由结构导致抽象函子都是微不足道的)。

我对“免费”的定义仅适用于种类*,但更一般的定义也适用于其他种类。例如,免费的单子。

你可以全力以赴,做一些疯狂的事情。例如,您可能可以在Sing k(类型的单例类型k)上定义自由布尔代数,其中k可使用 GADT 进行枚举。这涉及到一些“功能性”的东西在 Hask 中是非常不明显的。

于 2013-01-18T02:34:31.623 回答