| Safe Haskell | Safe-Inferred |
|---|---|
| Language | Haskell2010 |
PlutusTx.Optimize.SpaceTime
Description
Utilities for space-time tradeoff, such as recursion unrolling.
Documentation
Arguments
| ∷ ∀ a b. Int | How many recursion steps to move outside of the recursion loop. |
| → (Code Q (a → b) → Code Q (a → b)) | Function that given a continuation splice returns a splice representing a single recursion step calling this continuation. |
| → Code Q (a → b) |
Given n, and the step function for a recursive function, peel n layers
off of the recursion.
For example peel 3 (self -> [[| case [] -> 0; _ : ys -> 1 + self ys||])
yields the equivalence of the following function:
lengthPeeled :: [a] -> a
lengthPeeled xs =
case xs of -- first recursion step
[] -> 0
_ : ys -> 1 +
case ys of -- second recursion step
[] -> 0
_ : zs -> 1 +
case zs of -- third recursion step
[] -> 0
_ : ws -> 1 +
( fix self qs -> -- rest of recursion steps in a tight loop
case qs of
[] -> 0
_ : ts -> 1 + self ts
) ws
Arguments
| ∷ ∀ a b. Int | How many recursion steps to perform inside the recursion loop. |
| → (Code Q (a → b) → Code Q (a → b)) | Function that given a continuation splice returns a splice representing a single recursion step calling this continuation. |
| → Code Q (a → b) |
Given n, and the step function for a recursive function,
unroll recursion n layers at a time
For example unroll 3 (self -> [|| case [] -> 0; _ : ys -> 1 + self ys ||])
yields the equivalence of the following function:
lengthUnrolled :: [a] -> a
lengthUnrolled =
fix self xs -> -- beginning of the recursion "loop"
case xs of -- first recursion step
[] -> 0
_ : ys -> 1 +
case ys of -- second recursion step
[] -> 0
_ : zs -> 1 +
case zs of -- third recursion step
[] -> 0
_ : ws -> 1 + self ws -- end of the "loop"