rec-def: Recursively defined values

[ bsd2, data, library ] [ Propose Tags ]

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

will not loop, but rather produces the set fromList [23,42]

See Data.Recursive.Examples for more examples, or just browse the modules

More APIs (e.g. for maps or Natural) can be added over time, as need and good use-cases arise.

For the (unsafe) building blocks to build such APIs, see

The library is not (yet) focussed on performance, and uses a rather naive propagator implementation. Expect this to be slow if you have large graphs. This may be improved in the future (e.g. by propagating only deltas, and accumulating deltas before applying a function), but for now the focus is on foremost providing this capability in the first place and getting the user-facing API right.


[Skip to Readme]

Downloads

Maintainer's Corner

For package maintainers and hackage trustees

Candidates

  • No Candidates
Versions [RSS] 0.1, 0.2
Change log CHANGELOG.md
Dependencies base (>=4.9 && <5), containers (>=0.5.11 && <0.7) [details]
License BSD-2-Clause
Copyright 2022 Joachim Breitner
Author Joachim Breitner
Maintainer mail@joachim-breitner.de
Category Data
Home page https://github.com/nomeata/haskell-rec-def
Bug tracker https://github.com/nomeata/haskell-rec-def/issues/new
Source repo head: git clone git://github.com/nomeata/haskell-rec-def
Uploaded by JoachimBreitner at 2022-09-22T13:05:31Z
Distributions NixOS:0.1
Downloads 36 total (36 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2022-09-22 [all 1 reports]

Readme for rec-def-0.2

[back to package description]

rec-def - Pure recursive definition

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 to runST.

  • 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.