četvrtak, 31. svibnja 2007.

Lijena evaluacija u F#

let rec fibs = Seq.delay (fun() -> fibs |> Seq.cons 0I |> Seq.cons 1I |> Seq.pairwise |> Seq.map (fun (x,y) -> x+y))

Ovo je inače prijevod u F# Haskell onelinera:

fibs = 1 : 1 : zipWith (+) fibs (tail fibs)

seq<_> je inače tipni sinonim za CLR IEnumerable<T>, i sve su mu metode (osim nekoliko njih koji se ticu konverzija u striktno reducirane liste i nizove) lijeno (po potrebi) evaluirane:

> Seq.take 10 fibs;;
val it : bigint list = [1I; 1I; 2I; 3I; 5I; 8I; 13I; 21I; 34I; 55I]

Verzija koristeći ireffutable as-pattern:

let fib@(1:tfib) = 1 : 1 : [ a+b (a,b) <- zip fib tfib ]

Nije toliko trivijalno translatabilna, s obzirom da nije moguce napraviti strukturalni pattern-matching na seq<_> i njegove konstrutore tipa kojih (koliko vidim) - nema.

Nema komentara: