From: sgf Date: Fri, 2 Dec 2022 18:00:13 +0000 (+0300) Subject: new(fibs): Haskell's Fibonacci implementation on Go. X-Git-Url: https://gitweb.sgf-dma.tk/?a=commitdiff_plain;h=a28ae5f058ebbdb860beedefacfffb1e12e466a0;p=go.git new(fibs): Haskell's Fibonacci implementation on Go. --- diff --git a/fibs.go b/fibs.go new file mode 100644 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) + } +}