new(fibs): Haskell's Fibonacci implementation on Go.
authorsgf <sgf.dma@gmail.com>
Fri, 2 Dec 2022 18:00:13 +0000 (21:00 +0300)
committersgf <sgf.dma@gmail.com>
Fri, 2 Dec 2022 18:00:13 +0000 (21:00 +0300)
fibs.go [new file with mode: 0644]

diff --git a/fibs.go b/fibs.go
new file mode 100644 (file)
index 0000000..2950eb6
--- /dev/null
+++ b/fibs.go
@@ -0,0 +1,75 @@
+
+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)
+    }
+}