My friend's playing with Haskell, and asked me how I'd write a function to
take a list and return a list of the sums like so:
(f [1 2 4 8])
=> [1 3 7 15]
So I told him about Haskell's scanl function.
Is scanl available in Haskell?
These were my two versions of it and some simple benchmarks:
(defn scanl
([f seed coll]
(scanl f seed coll 1))
([f seed coll i]
(if (<= i (count coll))
(cons (reduce f seed (take i coll))
(scanl f seed coll (inc i))))))
(println (scanl + 0 [1 4 5 9]))
(defn scanl2 [f seed coll]
(loop [f f seed seed coll coll acc []]
(let [cnt (count acc)]
(if (< cnt (count coll))
(recur f seed coll (conj acc (reduce f seed (take (inc cnt) coll))))
acc))))
(println (scanl2 + 0 [1 4 5 9]))
(def first (with-out-str (time (scanl + 0 [1 4 5 9 6 7 8 9]))))
(def second (with-out-str (time (scanl2 + 0 [1 4 5 9 6 7 8 9]))))
(println first)
(println second)
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en