最近,我一直在進行“將所有內容提煉為基礎”的嘗試,并且我一直無法找到明確的理論原因來解釋 Traversable 型別類是如何定義的,只有“能夠遍歷很有用”的實際原因在應用余代數上,很多資料型別都可以做到這一點”和很多提示
我知道有一個適用的“家庭”,如https://duplode.github.io/posts/divisible-and-the-monoidal-quartet.html所述
我還知道,雖然 Traversable 遍歷是應用代數,但來自“semigroupoids”的 Traversable1 型別類描述了應用代數,而來自“分布”的 Distributive 型別類描述了函子代數
另外,我知道 Foldable、Foldable1 和理論上的 fold 家族成員描述了可以使用 monoid、半群和相應的 monoid 家族成員折疊的資料型別,例如巖漿(用于折疊為二叉樹)和每個的可交換版本(用于折疊作為每個的無序版本)
因此,由于 Traversable 是 Foldable 的子類,我假設它本質上是單面體,同樣我假設 Traversable1 本質上是半群的,而 Distributive 本質上是共面體(如“分布式”包中的描述中所述)
這感覺是正確的軌道,但是 Applicative 和 Apply 來自哪里呢?有巖漿和交換版本嗎?在具有非平凡的類群的類別中是否存在分配族?
本質上,我的問題是“這些型別類是否存在,它們是什么?如果不存在,為什么不存在?”:
class FoldableMagma t => TraversableMagma t where
traverseMagma :: ??? f => (a -> f b) -> (t a -> f (t b))
class FoldableCommute t => TraversableCommute t where
traverseCommute :: ??? f => (a -> f b) -> (t a -> f (t b))
class Foldable t => ContraTraversable t where
contraTraverse :: Divisible f => (b -> f a) -> (t a -> f (t b))
-- im really not sure on this last one
-- but it's how i'd expect an endofunctor over coalgebras to look
-- which seems potentially related to traversables?
可能不太重要的額外問題:在嘗試研究這個時,我遇到了“data-functor-logistic”包https://hackage.haskell.org/package/data-functor-logistic
這描述了逆變函子上的分布式版本 - 是否存在等效的可遍歷可除數(或可判定數)?
uj5u.com熱心網友回復:
我不知道有任何庫實作了這些類,但我會嘗試解開這些類代表什么。我是一名程式員,而不是類別理論家,所以對此持保留態度。
Applicative變種
ApplyMagma
該類ApplyMagma具有與該類完全相同的方法Apply,但它不需要遵循關聯定律。
class Functor f => ApplyMagma f where
(<.>) :: f (a -> b) -> f a -> f b
如果Apply類似于半群,ApplyMagma則類似于巖漿。
ApplyCommute
ApplyCommute 類將等價于 Apply 類,但具有以下交換律:
f <$> x <.> y = flip f <$> y <.> x
IfApply類似于半群,ApplyCommute類似于交換半群。
Traversable1變種
Traversable1Magma
ATraversable1Magma可以看作是Traversable1提供了有關結構的更多資訊的 a。雖然Foldable1類有toNonEmpty方法,但Foldable1Magma類可以有toBinaryTree方法。
class (FoldableMagma t, Traversable1 t) => Traversable1Magma t where
traverseMagma :: ApplyMagma f => (a -> f b) -> (t a -> f (t b))
Traversable1Commute
ATraversable1Commute可以看作是Traversable1沒有定義元素順序的 a。如果它不需要Ord a約束,則Setfromcontainers可以是此類的一個實體。Traversable1Commute 可能是 Traversable1 的超類。
class (FoldableCommute t, Functor t) => Traversable1Commute t where
traverseCommute :: ApplyCommute f => (a -> f b) -> (t a -> f (t b))
請注意,這些是 的變體,Traversable1因為既沒有ApplyMagma也沒有ApplyCommute等效于 的功能pure。
ContraTraversable
ContraTraversable沒有任何實體。要了解原因,請查看contraTraverse函式的型別。
contraTraverse :: Divisible f => (b -> f a) -> (t a -> f (t b))
我們可以將其專門用于以下方面:
contraTraverse :: Monoid b => (b -> Op b a) -> (t a -> Op b (t b))
這相當于以下內容:
contraTraverse ~ Monoid b => (b -> a -> b) -> t a -> t b -> a
使用const和conquerDivisible 中的函式,這使我們能夠創建任何型別的值,這是不可能的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/474025.html
