Играя си с CPS и Control.Monad.Cont
и се чудя какво печелим, като забележим монадичната структура. За код като този:
sumOfSquares'cps :: Cont r Int -> Cont r Int -> Cont r Int
sumOfSquares'cps x y = x >>= \x' ->
y >>= \y' ->
return (x'*x' + y'*y')
Може лесно да се пренапише като
type Cont' r a = (a -> r) -> r
sos'cps :: Cont' r Int -> Cont' r Int -> Cont' r Int
sos'cps x y = \k -> x $ \x' ->
y $ \y' ->
k (x'*x' + y'*y')
Не ме разбирайте погрешно, но не виждам усещането тук, освен че мога да използвам нотация do
и newtype
. Не мисля, че callCC
също зависи от екземпляра на монадата.
Липсва ми въображение, за да измисля пример. Какво всъщност получаваме, като обявим Cont r
за монада?
callCC
също зависи от екземпляра на монадата. Строго погледнато, нищо никога не е. Например вMaybe
монадатаreturn = Just
и(=<<) = maybe Nothing
. КласътMonad
абстрахира вече съществуваща функционалност, за да направи възможни нещата, които Майкъл Снойман споменава в своя отговор. - person duplode   schedule 10.06.2014Cont
, защото предполагам, че няма реална разлика в синтаксиса. - person Sebastian Graf   schedule 10.06.2014Cont
, може да искате да проверите Майката на всички монади. - person Ørjan Johansen   schedule 13.06.2014