--- /dev/null
+
+package main
+
+import (
+ "fmt"
+)
+
+// Classical Haskell Fibonacci numbers implementation
+//
+// xs :: [Int]
+// fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
+//
+// rewritten to Go.
+
+// fibs
+func fibsGen(in <-chan int) <-chan int {
+ out := make(chan int)
+
+ go func () {
+ out<- 0
+ for x := range in {
+ out<- x
+ }
+ }()
+
+ return out
+}
+
+// tail fibs
+func tailFibsGen(in <-chan int) <-chan int {
+ out := make(chan int)
+
+ go func () {
+ out<- 1
+ for x := range in {
+ out<- x
+ }
+ }()
+
+ return out
+}
+
+// 0 : 1 : zipWith(+) fibs (tail fibs)
+func fibs() <-chan int {
+ res := make(chan int)
+
+ inFibs := make(chan int)
+ fibs := fibsGen(inFibs)
+ inTail := make(chan int)
+ tailFibs := tailFibsGen(inTail)
+
+ go func() {
+ res<- 0
+ res<- 1
+ for {
+ x0 := <-fibs
+ x1 := <-tailFibs
+ y := x0 + x1
+ inFibs<- x1
+ inTail<- y
+ res<- y
+ }
+ }()
+
+ return res
+}
+
+func main() {
+ c := fibs()
+
+ for i := 0; i < 10; i++ {
+ n := <- c
+ fmt.Printf("[%v]: %v\n", i, n)
+ }
+}