Skip to content

Instantly share code, notes, and snippets.

@freddi301
Created July 29, 2024 09:55
Show Gist options
  • Save freddi301/46bce72fa3dd8de2484b0129fb935882 to your computer and use it in GitHub Desktop.
Save freddi301/46bce72fa3dd8de2484b0129fb935882 to your computer and use it in GitHub Desktop.
Dependent State monad in idris2
data DependentState : Type -> Type -> Type -> Type where
MakeDependentState : (s' -> (s'', r)) -> DependentState s' s'' r
ret : r -> DependentState s s r
ret r = MakeDependentState $ \s => (s, r)
get : DependentState s s s
get = MakeDependentState $ \s => (s, s)
set : s'' -> DependentState s' s'' ()
set s'' = MakeDependentState $ \s' => (s'', ())
(>>=) : DependentState s'x s''x rx -> (rx -> DependentState s''x s''y ry) -> DependentState s'x s''y ry
(>>=) (MakeDependentState f) g = MakeDependentState $ \s'x_v =>
let (s''x_v, rx_v) = f s'x_v in
let (MakeDependentState h) = g rx_v in
h s''x_v
(>>) : DependentState s'x s''x rx -> DependentState s''x s''y ry -> DependentState s'x s''y ry
(>>) x y = x >>= const y
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment