2016-05-29 45 views
3

Hom functorHom(-,-)在第一個參數中是逆變的,在第二個參數中是協變的。Hom Functor與Scala的Function1的對立有什麼聯繫?

這個事實可以以某種方式提供另一種解釋爲什麼斯卡拉的Function1[-T1, +R]具有相同的屬性?

我已經看到這個說法,例如here,但是在兩個概念之間的聯繫應該被解釋的地方,有太多的手揮舞着它將我吹走。

+0

我已經刪除了[tag:haskell],因爲它似乎完全不相關的問題。如果你關心haskell,你必須明確地指定你與haskell相關的問題。 – Bakuriu

回答

4

可能不會,如果你仔細的設置。 Function1 非常類似於(對象部分)的Hom函子 - 除了它的目標不是相當於相同的類別。 Function1映射的目標是scala類別(的子類別),它具有Scala類型作爲對象和函數的箭頭;而Hom函子的目標是(SET的子類)。他們的圖像可能是同構的,但並不清楚將兩個函數和同構結合在一起可以保留整個鏈中保存方差所需的結構。

7

有兩類Scala類型。

一個是通常的類型和函數類別,其中類型是對象,箭頭是函數。

另一個是類型和子類型類別,其中類型是對象,子類型關係是箭頭。這個類別是一個poset。

斯卡拉的協變性和逆變性恰恰是後一類範疇內的協同性和協變性。

由於投影箭頭將子類型映射爲超類型,現在第二個類別恰好是第一個類別的子類別。第一類箭頭正好是(全部)第二類箭頭。因此,第一類的每個協變內部管理者自然是(即通過自然變換)第二類的協變內部管理者。

的確,如果一個函子FAA'BB'和每箭頭f: A -> B映射到箭頭f': A' -> B',並且如果AB子類型,則投影箭頭prj_A,B被映射到投影箭頭prj_A',B',和如果存在,則A'B'的子類型。同樣的事情關於逆變函子。

現在只剩下看到Function1從某種意義上說是Hom函子。事實上,如果我們將Scala類型看作一組值,那麼Function1[A,B]是一組從AB的態射(斯卡拉函數)。箭頭映射由組合給出。既然它在第一類中是協變的(逆變),它在第二類中也必須是協變的(逆變)。

編輯:更正的亞型/ supertupe混淆。

聲明:我從來沒有學過類別理論。我可能會也可能不知道我在說什麼。

+1

我剛剛讀到這個偉大的答案,並認爲:「哇,很好的回答,他必須很好地理解類別理論」,然後我讀取了免責聲明。還是很好的答案。 –

+0

@ n.m。你說從SET的每個協變endofunctor到POSET上每個協變endofunctor都有一個自然轉換。那怎麼可能?首先,NT定義在兩個仿函數上,它們從相同的源類別開始,並在相同的目標類別中結束。 SET和POSET不是這種情況。其次,NT保留類別的內部結構。情況並非如此。 SET中的許多組通過POSET中不存在的態射連接。 – rapt

+0

@rapt第一類不是SET,它是SCALA,Scala類型和函數的類別)。類似但不一樣。第二類不是POSET(我的壞,錯誤的符號體系固定),它是** a ** poset。 (每個poset是一個類別)。稱之爲SCALA-2。 SCALA-2是SCALA的一個子類別,當您將SCALA的端元管理員限制爲SCALA-2時,自然轉換會自然發生。 –