datafix-0.0.0.1: examples/Fib.hs
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
module Fib where
import Datafix
import Numeric.Natural
fibProblem :: forall m . (MonadDependency m, Domain m ~ Natural) => DataFlowProblem m
fibProblem = DFP transfer (const (eqChangeDetector @(Domain m)))
where
transfer :: Node -> LiftedFunc Natural m
transfer (Node 0) = return 0
transfer (Node 1) = return 1
transfer (Node n) = do
a <- dependOn @m (Node (n-1))
b <- dependOn @m (Node (n-2))
return (a + b)
fib :: Int -> Natural
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)