2016-11-27 81 views
11

在沉思些什麼有用的標準類建議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-yR2,一個較爲普遍的野獸可能潛伏在這裏:一個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的結果的兩個字段都包含相同的類型,並且還有許多其他的,也許是「更好」的可想象的簽名。

有什麼想法?

+2

不是答案,而是:(co)monad只是** endo **仿函數的範疇中的一個(複合)monoid(具有仿函數構成作爲張量積),對嗎? Haskell雙刃管不是內管工。所以我不確定一個真正的雙(單)monad會是什麼樣子,或者即使在雙功能器之上構建這樣一個事情也是有意義的。但也許還有一些有用的東西看起來「有點像」雙生子,所以它仍然是一個有趣的問題。 –

回答

1

這不是一個答案,但對於Bimonad,這個怎麼樣?

class Biapplicative p => Bimonad p where 
    (>>==) :: p a b -> (a -> b -> p c d) -> p c d 

biap :: Bimonad p => p (a -> b) (c -> d) -> p a c -> p b d 
biap p q = p >>== \ab cd -> q >>== \a c -> bipure (ab a) (cd c) 

instance Bimonad (,) where 
    (a,b) >>== f = f a b 

我不知道這是否是正確的斷然/有趣,甚至遠程有用的,但它的權利從一個Haskell的角度氣味。它是否符合你的Bicomonad或類似的東西?

+2

不確定;這看起來很像普通的'Monad',只限於元組參數(然後被curried)。 – leftaroundabout

+0

@leftaroundabout同意。不過,我確實懷疑,如果/你的雙子座與限制爲元組參數的共同點不同。 – chi

+0

@leftaroundabout,對於'Biapplicative'也不是那麼簡單(如果你排除了像Const一樣的無聊函數)? – dfeuer

相關問題