mlabs-haskell / mlabs-haskell/lambda-buffers
Plutarch codegen: Recursive data type support
Nobody has claimed this yet.
- Dominant language
- Haskell
- Stars
- 32
- Forks
- 1
- PR merge metrics
- No merged PRs in 30d
Description
One does not simply recurse in Plutarch.
My raw lambda calculus skills are not at the level where I'm just popping out fixpoint based terms so let's get back to the drawing board:
For a canonical recursive data type example and some mutually recursive ones:
sum List a = Cons a (List a) | Nil
sum F a = Rec (G a) | Nil
sum G a = Rec (F a) | Nil
What we do eventually is invoke some polymorphic class method on the constituents of each constructor (if it's a sum type, but also for products and records). This is where the problem happens right? How would we use pfix in this situation?
(let's imagine we have an annotation that tells us whether a type is infinite or not).
pfix :: Term s (((a :--> b) :--> (a :--> b)) :--> (a :--> b))
fib :: Term s (PInteger :--> PInteger)
fib = phoistAcyclic $
pfix #$ plam $ \self n ->
pif
(n #== 0)
0
$ pif
(n #== 1)
1
$ self # (n - 1) + self # (n - 2)
Main question is: How do we generate code in a uniform manner such that we can recurse properly?
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reading the Plutarch pfix definition and tracing the existing code-generation entry points for recursive and mutually recursive types. Compare the List, F, and G examples in the issue with the generated terms. Done means a uniform generation approach is defined and demonstrated for recursive data types, including the relevant polymorphic constructor handling.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- haskell
- Domain
- compilers
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 25/100