This library provides safe APIs that allow you to define and calculate values recursively, and still get a result out:
>>> :{
let s1 = RS.insert 23 s2
s2 = RS.insert 42 s1
in RS.get s1
:}
fromList [23,42]
See the examples.hs
file for more examples.
It also provides (unsafe) building blocks to build such APIs, see
Data.Propagator.Purify
.
-
Edward Kmett's
Data.Propagator.Prop
module achieves something similar, and allows to construct more the graphs more flexibly, but requires a stricter phase control akin torunST
. -
Jeannin, Kozen and Silva’s work on “CoCaml: Functional Programming with Regular Coinductive Types” in Ocaml even goes a step further and not only allow the recursive definitions to be written down as here, but even allows functions consume regular recursive values, and still produces something that can be solved.