All pastes #664947 Raw Edit

Something

public text v1 · immutable
#664947 ·published 2007-08-20 23:10 UTC
rendered paste body
import Control.Arrow

data DCont r a = DReturn a | DShift ((a -> DCont r r) -> DCont r r)

shift :: ((a -> DCont r r) -> DCont r r) -> DCont r a
shift = DShift

reset :: DCont r r -> r
reset act = reset' act return

reset' :: DCont r a -> (a -> DCont r r) -> r
reset' (DReturn val) rem = reset (rem val)
reset' (DShift f) rem = reset (f rem)

instance Monad (DCont r) where
  return = DReturn
  DReturn val >>= rem = rem val
  DShift f >>= rem = DShift (\rem' -> f (rem >>> rem'))