如何在Haskell中添加表示x和y坐标的元组列表,然后找到所有x值和y值的平均值(基本上是尝试找到质心)。
所以可以说我有一个[[1,1),(2,2),(3,6)]的输入列表,我希望输出是(2,3)。
答案 0 :(得分:0)
这将在没有空间泄漏且不会中断流融合的情况下起作用:
{-# LANGUAGE BangPatterns #-}
import Data.Foldable (foldl')
centroid :: (Fractional n, Foldable t) => t (n, n) -> (n, n)
centroid coords = (xsum/count, ysum/count)
where (xsum,ysum,count) = foldl' go (0,0,0) coords
go (!xs,!ys,!c) (x,y) = (xs + x, ys + y, c + 1)
如果需要,可以随意用`div`替换/,用Integral代替小数,和/或在必要时添加realToFrac以使类型生效。另外,如果您不想使用BangPatterns,则可以在所有三个元素上使用seq。