基于Wikipedia's definition of a free object,在我看来,每个Functor都是Hask中的Free。相反,每个自由对象也应该是一个Functor。这是正确的,还是我误解了?
答案 0 :(得分:3)
我不确定你的意思。通常,在功能编程上下文中,分类定义的编写方式比想要的更为通用。不要使用具体类别的维基百科定义,而应考虑您所获得的定义,将您想要的事物作为参数处理。
定义:免费 foo 。类型T
上的免费 foo 是一个对象FT
,以便{ {1}}是一个 foo ,一个函数F
,以便存在任何其他 foo i :: T -> FT
和一个函数S
一个独特的 foo态射 f :: T -> S
,f'
。
插入说“monoid”,你得到免费的monoid,组,你得到自由组等。注意,这个定义基本上没有类别理论,大多数肯定不会谈论仿函数。它不如维基百科给出的定义那么正式,但应该直观地工作。根据这个定义,自由构造是制作自由对象的一般方法。例如,f' . i = f
为幺半群提供了免费构造,[]
是所有[a]
a
上的免费幺半群。
我不认为所有的仿函数都是免费的仿函数。我也不认为Hask中的所有自由构造都是 Haskell 仿函数(所有自由构造导致抽象函子都是微不足道的)。
我对“免费”的定义仅适用于a
类的事物,但更一般的定义也适用于其他类型。例如,免费的monads。
你可以全力以赴做疯狂的事情。例如,您可以在*
上定义免费布尔代数(类型Sing k
的单例类型),其中k
可使用GADT进行枚举。这涉及“functorial”的东西在Hask中将是非常不明显的。