如何在Haskell中找到坐标元组列表的平均值?

时间:2019-03-06 05:59:58

标签: haskell

如何在Haskell中添加表示x和y坐标的元组列表,然后找到所有x值和y值的平均值(基本上是尝试找到质心)。

所以可以说我有一个[[1,1),(2,2),(3,6)]的输入列表,我希望输出是(2,3)。

1 个答案:

答案 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。