Guest User

Untitled

a guest
Jul 20th, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.49 KB | None | 0 0
  1. module Fibs where
  2. import StreamProc
  3. import Control.Arrow
  4.  
  5. test = take 10 $ runSP fibs [0..]
  6.  
  7. fibs :: SP a Integer
  8. fibs = put 0 fibs'
  9. where fibs' = put 1 $ liftA2 (+) fibs fibs'
  10.  
  11. {-
  12. runSP fibs [] = [0, 1]
  13.  
  14. runSP (Put 0 fibs') []
  15. => 0:runSP fibs' []
  16. => 0:runSP (Put 1 $ liftA2 (+) fibs fibs') []
  17. => 0:1:runSP (liftA2 (+) fibs fibs') []
  18. => 0:1:runSP ((fibs &&& fibs') >>> arr (uncurry (+))) []
  19. => 0:1:runSP (arr (\x -> (x, x)) >>> fibs *** fibs' >>> arr (uncurry (+))) [] ... [1]
  20.  
  21. arr (\x -> (x, x))
  22. => Get $ \a -> Put (a, a) (arr (\x -> (x, x))) ... [2]
  23.  
  24. arr (uncurry (+))
  25. => Get $ \(a, b) -> Put (a + b) (arr (uncurry (+))) ... [3]
  26.  
  27. fibs *** fibs'
  28. => first fibs >>> second fibs'
  29. => bypass [] fibs >>> second fibs'
  30. => bypass [] (Put 0 fibs') >>> second fibs'
  31. => Get (\(b, d) -> Put (0, d) (bypass [] fibs')) >>> second fibs'
  32. => Get (\(b ,d) -> Put (0, d) (bypass [] fibs')) >>> second (Put 1 $ liftA2 (+) fibs fibs')
  33. => Get (\(b ,d) -> Put (0, d) (bypass [] fibs')) >>> Get (\(d, b) -> Put (d, 1) (bypass [] (liftA2 (+) fibs fibs')))
  34. => Get (\(b, d) -> Put (0, d) (bypass [] fibs') >>> Get (\(d, b) -> Put (d, 1) (bypass [] (liftA2 (+) fibs fibs')))) ... [4]
  35.  
  36. [2], [3], [4]から
  37. arr (\x -> (x, x)) >>> fibs *** fibs' >>> arr (uncurry (+))
  38. => Get $ \a -> Put (a, a) (arr (\x -> (x, x)))
  39. >>> Get (\(b, d) -> Put (0, d) (bypass [] fibs') >>> Get (\(d, b) -> Put (d, 1) (bypass [] (liftA2 (+) fibs fibs'))))
  40. >>> Get $ \(a, b) -> Put (a + b) (arr (uncurry (+)))
  41.  
  42. => Get $ \a -> Put (a, a) (arr (\x -> (x, x)))
  43. >>> Get (\a -> sp2 a >>> Get sp1)
  44. where sp2 = \(b, d) -> Put (0, d) (bypass [] fibs') >>> Get (\(d, b) -> Put (d, 1) (bypass [] (liftA2 (+) fibs fibs')))
  45. sp1 = \(a, b) -> Put (a + b) (arr (uncurry (+)))
  46.  
  47. => Get $ \b -> sp2' b >>> Get sp1'
  48. where sp2' = \a -> Put (a, a) (arr (\x -> (x, x)))
  49. sp1' = \a -> sp2 a >>> Get sp1
  50. sp2 = \(b, d) -> Put (0, d) (bypass [] fibs') >>> Get (\(d, b) -> Put (d, 1) (bypass [] (liftA2 (+) fibs fibs')))
  51. sp1 = \(a, b) -> Put (a + b) (arr (uncurry (+))) ... [5]
  52.  
  53. [1], [5]から
  54. 0:1:runSP (arr (\x -> (x, x)) >>> fibs *** fibs' >>> arr (uncurry (+))) []
  55. => 0:1:runSP (Get $ \b -> sp2' b >>> Get sp1') []
  56. where sp2' = \a -> Put (a, a) (arr (\x -> (x, x)))
  57. sp1' = \a -> sp2 a >>> Get sp1
  58. sp2 = \(b, d) -> Put (0, d) (bypass [] fibs') >>> Get (\(d, b) -> Put (d, 1) (bypass [] (liftA2 (+) fibs fibs')))
  59. sp1 = \(a, b) -> Put (a + b) (arr (uncurry (+)))
  60. => 0:1:[]
  61. => [0, 1]
  62. -}
Add Comment
Please, Sign In to add comment