![](/img/trans.png)
[英]Why is there a distinction between co and contravariant functors in Haskell but not Category Theory?
[英]How are functors in Haskell related to functors in category theory?
Functor
一個實例指定了兩件事:類型構造函數F
的種類* -> *
,即從Hask的對象到Hask的對象的映射,以及類型的函數(a -> b) -> (F a -> F b)
,即從Hask的箭頭到與對象映射F
兼容的Hask的箭頭的映射。 所以,是的, Functor
所有實例都是endofunctors。 Hackage有幾種可用的概括,例如Control.Categorical.Functor 。
是的,所有Functor
實例都是Hask上的endofunctors - 事實上,來自所有Hask的endofunctors到一個適當的子類,其對象是通過應用特定類型構造函數獲得的類型。 該類型構造函數與Functor
實例相關聯,並提供對象的映射; 態射的映射是fmap
,它(因為我們只關注笛卡爾閉合范疇的endofunctors)本身就是Hask中的態射系列 。
除了那些可以有Functor
實例的函數之外,考慮其他函子是有意義的,例如逆變函子 (從Hask到它的相反類別)。 Arrow
類中的arr
函數也對應於一個仿函數,從所有Hask到其對象與Hask的對象相同的類別 ,其狀態由與Arrow
實例關聯的類型構造函數描述。
進一步的概括也是可能的(正如Daniel Wagner指出的那樣),但使用起來往往變得越來越尷尬。
關於這一點的一個重要的一點是,你真正想要的是富含 Hask的函子,而不僅僅是普通的舊算子。 Hask是笛卡爾閉合的( 不是真的 ,但它很難成為那樣),因此它本身就是自然豐富的。
現在,豐富的endofunctors為你提供了一種限制語言中可實現的方法 :一個豐富的函子Hask - > Hask是對象(類型) fa
和每對對象a, b
一個函數Hask中的態射f: Hask (a,b) - > Hask (fa,fb) 。 當然,這只是fmap :: (a -> b) -> fa -> fb
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.