Hask中的函数和自由对象

时间:2013-01-17 20:49:07

标签: haskell category-theory

基于Wikipedia's definition of a free object,在我看来,每个Functor都是Hask中的Free。相反,每个自由对象也应该是一个Functor。这是正确的,还是我误解了?

1 个答案:

答案 0 :(得分:3)

我不确定你的意思。通常,在功能编程上下文中,分类定义的编写方式比想要的更为通用。不要使用具体类别的维基百科定义,而应考虑您所获得的定义,将您想要的事物作为参数处理。

定义:免费 foo 类型T上的免费 foo 是一个对象FT,以便{ {1}}是一个 foo ,一个函数F,以便存在任何其他 foo i :: T -> FT和一个函数S一个独特的 foo态射 f :: T -> Sf'

插入说“monoid”,你得到免费的monoid,组,你得到自由组等。注意,这个定义基本上没有类别理论,大多数肯定不会谈论仿函数。它不如维基百科给出的定义那么正式,但应该直观地工作。根据这个定义,自由构造是制作自由对象的一般方法。例如,f' . i = f为幺半群提供了免费构造,[]是所有[a] a上的免费幺半群。

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

我对“免费”的定义仅适用于a类的事物,但更一般的定义也适用于其他类型。例如,免费的monads。

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