Skip to content

Instantly share code, notes, and snippets.

@useronym
Last active May 26, 2017 09:35
Show Gist options
  • Select an option

  • Save useronym/a44e51dee96a431cfe50d206de52995a to your computer and use it in GitHub Desktop.

Select an option

Save useronym/a44e51dee96a431cfe50d206de52995a to your computer and use it in GitHub Desktop.
module Delay
%default total
codata Partial : Type -> Type where
Now : a -> Partial a
Later : Partial a -> Partial a
Functor Partial where
map f (Now x) = Now (f x)
map f (Later x) = Later (map f x)
Applicative Partial where
pure = Now
(Now f) <*> (Now x) = Now (f x)
(Later f) <*> x = Later (f <*> x)
f <*> (Later x) = Later (f <*> x)
Monad Partial where
(Now x) >>= f = f x
(Later x) >>= f = Later (x >>= f)
never : Partial a
never = Later never
runForSteps : Partial a -> Nat -> Partial a
runForSteps (Now x) k = Now x
runForSteps (Later x) Z = Later x
runForSteps (Later x) (S k) = runForSteps x k
runForSteps' : Partial a -> Nat -> List (Partial a)
runForSteps' (Now x) k = [Now x]
runForSteps' (Later x) Z = [Later x]
runForSteps' (Later x) (S k) = (Later x) :: (runForSteps' x k)
isEven : Nat -> Bool
isEven Z = True
isEven (S Z) = False
isEven (S (S n)) = isEven n
collatzStep : Nat -> Nat
collatzStep n with (isEven n)
| True = divNatNZ n 2 (absurd . sym)
| False = (3 * n) + 1
collatz : Nat -> Partial Nat
collatz n = if n <= 1 then (Now n)
else (Later (collatz (collatzStep n)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment