Studiuję Monady Haskella. Kiedy przeczytałem artykuł o Wikipedii Category theory, stwierdziłem, że sygnatura morfizmów monady wygląda całkiem jak tautologie w logice, ale musisz przekonwertować M a
na ~~A
, tutaj ~
jest logiczną negacją.Czy jest coś, co nazywa się "semi-monad" lub "counter-monad"?
return :: a -> M a -- Map to tautology A => ~~A, double negation introduction
(>>=) :: M a -> (a -> M b) -> M b -- Map to tautology ~~A => (A => ~~B) => ~~B
innych operacji jest także tautologie:
fmap :: (a -> b) -> M a -> M b -- Map to (A => B) -> (~~A => ~~B)
join :: M (M a) -> M a -- Map to ~~(~~A) => ~~A
Jest również zrozumiałe, że zgodnie z tym, że Curry-Howard korespondencja normalnych językach funkcjonalnych jest intuicyjny logika nie logika klasyczna, więc nie możemy oczekiwać Tautologia taka jak ~~A => A
może mieć korespondencję.
Ale myślę o czymś innym. Dlaczego monada może odnosić się tylko do podwójnej negacji? jaka jest zgodność pojedynczej negacji? To prowadzi mnie do następującej definicji klasy:
class Nomad n where
rfmap :: (a -> b) -> n b -> n a
dneg :: a -> n (n a)
return :: Nomad n => a -> n (n a)
return = dneg
(>>=) :: Nomad n => n (n a) -> (a -> n (n b)) -> n (n b)
x >>= f = rfmap dneg $ rfmap (rfmap f) x
Tu zdefiniował pojęcie o nazwie „Nomad” i obsługuje dwie operacje (zarówno związanych z aksjomatu logiki intuicyjnej logiki). Zauważ, że nazwa "rfmap" oznacza fakt, że jej podpis jest podobny do podpisu functora fmap
, ale kolejność a
i b
jest odwrotna. Teraz mogę ponownie zdefiniować operacje Monad z nimi, zamieniając M a
na n (n a)
.
Teraz przejdźmy do części pytania. To, że Monad jest pojęciem z teorii kategorii, zdaje się oznaczać, że mój "Nomad" jest także pojęciem teorii kategorii. Więc co to jest? To jest użyteczne? Czy istnieją jakieś dokumenty lub wyniki badań w tym temacie?
'rfmap' jest operacją na [przeciwwariantowych funktorach] (http://hackage.haskell.org/packages/archive/contravariant/latest/doc/html/Data-Functor-Contravariant.html). – shachaf
Tytuł twojego pytania zadał pytanie, czy istnieje "semi-monad", ale twoje aktualne pytanie poszło w innym kierunku. W interesie zupełności powinno się zauważyć, że "semi-monada" może odnosić się do monady, która nie ma operacji jednostkowej (tj. W Haskell, nie ma dobrze zdefiniowanego "return :: a -> m a ') lub którego działanie jednostki nie zachowuje się jak jednostka, np.' (return x) >> = f =/= f x '. Jest to podobne do pojęcia "pół-grupy" oznaczającej monoid bez jednostki (lub dobrze zachowanej jednostki). – dorchard
Kiedy mówię "semi-monad", mam na myśli fakt, że 'Nomad' wygląda jak połowa' Monady', ponieważ 'n (n a)' jest dobrze zdefiniowanym 'Monadem'. –