试图理解Clojure和Haskell之间的差异。我有以下代码来计算时间序列数字列表的移动平均值:
movavg n [] = []
movavg n (x:xs) = map (/ n') sums
where
sums = scanl (+) (n' * x) $ zipWith (-) xs (replicate n x ++ xs)
n' = fromIntegral n
在Clojure中这个惯用版本会是什么?
答案 0 :(得分:4)
我不明白为什么这个字面翻译不应该是惯用的,即:
(defn movavg [n coll]
(when-let [[x & xs] (seq coll)]
(map #(/ % n)
(reductions + (* n x)
(map - xs (concat (repeat n x) xs))))))
特别是具有大量序列函数的代码总是有可能非常接近Haskell,因为它们很懒惰。
修改:根据Justin Kramer的建议缩短代码。