Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module Fibs where
- import StreamProc
- import Control.Arrow
- test = take 10 $ runSP fibs [0..]
- fibs :: SP a Integer
- fibs = put 0 fibs'
- where fibs' = put 1 $ liftA2 (+) fibs fibs'
- {-
- runSP fibs [] = [0, 1]
- runSP (Put 0 fibs') []
- => 0:runSP fibs' []
- => 0:runSP (Put 1 $ liftA2 (+) fibs fibs') []
- => 0:1:runSP (liftA2 (+) fibs fibs') []
- => 0:1:runSP ((fibs &&& fibs') >>> arr (uncurry (+))) []
- => 0:1:runSP (arr (\x -> (x, x)) >>> fibs *** fibs' >>> arr (uncurry (+))) [] ... [1]
- arr (\x -> (x, x))
- => Get $ \a -> Put (a, a) (arr (\x -> (x, x))) ... [2]
- arr (uncurry (+))
- => Get $ \(a, b) -> Put (a + b) (arr (uncurry (+))) ... [3]
- fibs *** fibs'
- => first fibs >>> second fibs'
- => bypass [] fibs >>> second fibs'
- => bypass [] (Put 0 fibs') >>> second fibs'
- => Get (\(b, d) -> Put (0, d) (bypass [] fibs')) >>> second fibs'
- => Get (\(b ,d) -> Put (0, d) (bypass [] fibs')) >>> second (Put 1 $ liftA2 (+) fibs fibs')
- => Get (\(b ,d) -> Put (0, d) (bypass [] fibs')) >>> Get (\(d, b) -> Put (d, 1) (bypass [] (liftA2 (+) fibs fibs')))
- => Get (\(b, d) -> Put (0, d) (bypass [] fibs') >>> Get (\(d, b) -> Put (d, 1) (bypass [] (liftA2 (+) fibs fibs')))) ... [4]
- [2], [3], [4]から
- arr (\x -> (x, x)) >>> fibs *** fibs' >>> arr (uncurry (+))
- => Get $ \a -> Put (a, a) (arr (\x -> (x, x)))
- >>> Get (\(b, d) -> Put (0, d) (bypass [] fibs') >>> Get (\(d, b) -> Put (d, 1) (bypass [] (liftA2 (+) fibs fibs'))))
- >>> Get $ \(a, b) -> Put (a + b) (arr (uncurry (+)))
- => Get $ \a -> Put (a, a) (arr (\x -> (x, x)))
- >>> Get (\a -> sp2 a >>> Get sp1)
- where sp2 = \(b, d) -> Put (0, d) (bypass [] fibs') >>> Get (\(d, b) -> Put (d, 1) (bypass [] (liftA2 (+) fibs fibs')))
- sp1 = \(a, b) -> Put (a + b) (arr (uncurry (+)))
- => Get $ \b -> sp2' b >>> Get sp1'
- where sp2' = \a -> Put (a, a) (arr (\x -> (x, x)))
- sp1' = \a -> sp2 a >>> Get sp1
- sp2 = \(b, d) -> Put (0, d) (bypass [] fibs') >>> Get (\(d, b) -> Put (d, 1) (bypass [] (liftA2 (+) fibs fibs')))
- sp1 = \(a, b) -> Put (a + b) (arr (uncurry (+))) ... [5]
- [1], [5]から
- 0:1:runSP (arr (\x -> (x, x)) >>> fibs *** fibs' >>> arr (uncurry (+))) []
- => 0:1:runSP (Get $ \b -> sp2' b >>> Get sp1') []
- where sp2' = \a -> Put (a, a) (arr (\x -> (x, x)))
- sp1' = \a -> sp2 a >>> Get sp1
- sp2 = \(b, d) -> Put (0, d) (bypass [] fibs') >>> Get (\(d, b) -> Put (d, 1) (bypass [] (liftA2 (+) fibs fibs')))
- sp1 = \(a, b) -> Put (a + b) (arr (uncurry (+)))
- => 0:1:[]
- => [0, 1]
- -}
Add Comment
Please, Sign In to add comment