在沉思些什麼有用的標準類建議to this one雙共同體的方法是什麼?
class Coordinate c where
createCoordinate :: x -> y -> c x y
getFirst :: c x y -> x
getSecond :: c x y -> y
addCoordinates :: (Num x, Num y) => c x y -> c x y -> c x y
它發生我,而不是其他VectorSpace
-y或R2
,一個較爲普遍的野獸可能潛伏在這裏:一個Type -> Type -> Type
它的兩個包含類型都可以提取。嗯,也許他們可以是extract
ed?
結果都不是comonad
也不是bifunctors
包中包含所謂的Bicomonad
。問題是,從類別理論上講,這樣的班級是否有意義?不像Bimonad
(其中還沒有定義,我也實在看不出可能是什麼樣子),一個天真的定義似乎也合情合理:
class Bifunctor c => Bicomonad c where
fst :: c x y -> x
snd :: c x y -> y
bidup :: c x y -> c (c x y) (c x y)
與法律
fst . bidup ≡ id
snd . bidup ≡ id
bimap fst snd . bidup ≡ id
bimap bidup bidup . bidup ≡ bidup . bidup
可能,但我覺得它令人不安的是bidup
的結果的兩個字段都包含相同的類型,並且還有許多其他的,也許是「更好」的可想象的簽名。
有什麼想法?
不是答案,而是:(co)monad只是** endo **仿函數的範疇中的一個(複合)monoid(具有仿函數構成作爲張量積),對嗎? Haskell雙刃管不是內管工。所以我不確定一個真正的雙(單)monad會是什麼樣子,或者即使在雙功能器之上構建這樣一個事情也是有意義的。但也許還有一些有用的東西看起來「有點像」雙生子,所以它仍然是一個有趣的問題。 –