Advertisement
Guest User

Untitled

a guest
Sep 19th, 2019
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.17 KB | None | 0 0
  1. public module cont
  2.  
  3. public import function
  4.  
  5. public struct ccont<r, a>(k : (a -> r) -> r)
  6.  
  7. public fun runCont<r, a>(c : ccont<r, a>): ((a -> r) -> r) {
  8. c.k
  9. }
  10.  
  11. public fun runCont'<r, a>(c : ccont<r, a>, f : (a) -> r) : r {
  12. runCont(c)(f)
  13. }
  14.  
  15. private effect econt<r, a> {
  16. fun econt(k : ccont<r, a>): a
  17. }
  18.  
  19. val do : forall<r, a, b>((() -> <econt<r, b>> ccont<r, a>) -> ccont<r, a>)
  20. = handler {
  21. econt(m) ->
  22. Ccont(fun(k) {
  23. m.runCont'(fun(x) {
  24. x.resume.runCont'(k)
  25. })
  26. })
  27. }
  28.  
  29. public fun cont<r, a>(f : ((r -> a) -> a)) : <econt<a, r>> r {
  30. f . Ccont . econt
  31. }
  32.  
  33. public fun pure<r, a>(x : a) : ccont<r, a> {
  34. x . (|>) . Ccont
  35. }
  36.  
  37. public fun run<r>(cont : ccont<r, r>) : r {
  38. cont . runCont $ id
  39. }
  40.  
  41. public fun abort<a, b>(v: a): <econt<a, b>> b {
  42. cont(fun(_) {v})
  43. }
  44.  
  45. public fun runAbortive<r, a>(default : r, cont : ccont<r, a>) : r {
  46. cont . runCont $ (fun(_) { default })
  47. }
  48.  
  49. val ok = fun() : <econt<int, int>> int {
  50. run $ do {
  51. val x = cont(fun(k:int -> int) { k(10) * k(10) })
  52. val y = 20
  53. val z = 30
  54. return pure $ x + y + z
  55. }
  56. }
  57.  
  58. val abortive = fun(default : string, x : int) : string {
  59. (fun(k) { runAbortive(default, k) }) $
  60. do {
  61. if (x < 9) then abort $ "ouch"
  62. else
  63. pure $ x
  64. }
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement