Advertisement
Guest User

Untitled

a guest
Oct 14th, 2019
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.34 KB | None | 0 0
  1. #include "share/atspre_staload.hats"
  2.  
  3. vtypedef llist(a:vt@ype) = List_vt(a)
  4.  
  5.  
  6. extern fun{fa,a0:vt0p}{fb,b0:vt0p}
  7. monad_bind: (!fa) -> fb
  8. extern fun{a0:vt0p}{fb,b0:vt0p}
  9. monad_bind$f: (!a0) -> fb
  10.  
  11. extern fun{fa,a0:vt0p}{fb,b0:vt0p}
  12. monad_fmap: (!fa) -> fb
  13. extern fun{a0:vt0p}{b0:vt0p}
  14. monad_fmap$f: (!a0) -> b0
  15.  
  16.  
  17. extern fun{fa,a0:vt0p}{fb,b0:vt0p}
  18. monad_bind_free: fa -> fb
  19. extern fun{a0:vt0p}{fb,b0:vt0p}
  20. monad_bind_free$f: a0 -> fb
  21.  
  22. extern fun{fa,a0:vt0p}{fb,b0:vt0p}
  23. monad_fmap_free: (fa) -> fb
  24. extern fun{a0:vt0p}{b0:vt0p}
  25. monad_fmap_free$f: a0 -> b0
  26.  
  27. extern fun{fa,a0:vt0p}
  28. monad_return(x0: a0): fa
  29.  
  30. implement(a:vt@ype)
  31. monad_return<llist(a),a>(x0) = list_vt_sing(x0)
  32.  
  33. implement(a:vt@ype)
  34. monad_return<llist(a),a>(x0) = list_vt_sing(x0)
  35.  
  36. implement(a,b:t@ype)
  37. monad_bind<llist(a),a><llist(b),b>(fx) =
  38. list_vt_concat<b>(list_vt_map<a><llist(b)>(fx)) where
  39. implement
  40. list_vt_map$fopr<a><llist(b)>(x) =
  41. monad_bind$f<a><llist(b),b>(x)
  42. end
  43.  
  44. implement{fa,a0}{fb,b0}
  45. monad_fmap(fx) =
  46. (
  47. monad_bind<fa,a0><fb,b0>(fx) where
  48. implement
  49. monad_bind$f<a0><fb,b0>(x0) =
  50. (monad_return<fb,b0>(monad_fmap$f<a0><b0>(x0)))
  51. end
  52. )
  53.  
  54. implement(a,b:t@ype)
  55. monad_bind_free<llist(a),a><llist(b),b>(fx) =
  56. list_vt_concat<b>(list_vt_mapfree<a><llist(b)>(fx)) where
  57. implement
  58. list_vt_mapfree$fopr<a><llist(b)>(x) =
  59. monad_bind_free$f<a><llist(b),b>(x)
  60. end
  61.  
  62. implement{fa,a0}{fb,b0}
  63. monad_fmap_free(fx) =
  64. (
  65. monad_bind_free<fa,a0><fb,b0>(fx) where
  66. implement
  67. monad_bind_free$f<a0><fb,b0>(x0) =
  68. (monad_return<fb,b0>(monad_fmap_free$f<a0><b0>(x0)))
  69. end
  70. )
  71.  
  72. local
  73.  
  74. implement fprint_list_vt$sep<>(out) = ()
  75.  
  76. in
  77.  
  78. fun test_free(): void =
  79. {
  80. val xs = $list_vt{int}(70,114,101,101,100)
  81.  
  82. val ys = monad_fmap_free<llist(int),int><llist(char),char>(xs) where
  83. implement
  84. monad_fmap_free$f<int><char>(x) = int2char0(x)
  85. end
  86.  
  87. val () = println!(ys) where
  88. implement fprint_list_vt$sep<>(out) = ()
  89. end
  90.  
  91.  
  92. val () = list_vt_free(ys)
  93. }
  94.  
  95. fun test_preserve(): void =
  96. {
  97. val xs = $list_vt{int}(80,114,101,115,101,114,118,101,100)
  98.  
  99. val ys = monad_fmap<llist(int),int><llist(char),char>(xs) where
  100. implement
  101. monad_fmap$f<int><char>(x) = int2char0(x)
  102. end
  103.  
  104. val () = println!(ys)
  105.  
  106. // notice: xs was preserved so we need to free it...
  107. val () = list_vt_free(xs)
  108. val () = list_vt_free(ys)
  109. }
  110.  
  111. end
  112.  
  113. implement main0() = (test_free(); test_preserve())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement