假设我有一个记录列表,我想通过取中位数来对它进行总结。更具体地讲,说我有总结Haskell记录列表
data Location = Location { x :: Double, y :: Double }
我的测量结果列表,我想将它总结成一个中间Location
,所以像:
Location (median (map x measurements)) (median (map y measurements))
这很好,但如果我有一些更多的嵌套,如:
data CampusLocation = CampusLocation { firstBuilding :: Location
,secondBuilding :: Location }
我有CampusLocation
个清单,我想总结CampusLocation
,其中递归地应用到所有的中位数领域。
在Haskell中做到这一点最干净的方法是什么?镜头? Uniplate中?
编辑:奖金:
如果不是包含我们要总结领域的记录,我们有什么,而不是一个隐含的名单?例如:
data ComplexCampus = ComplexCampus { buildings :: [Location] }
我们怎样才能总结出[ComplexCampus]
成ComplexCampus
,假设每个buildings
的是相同的长度?
I a米突然想象这种事情将适合镜头遍历的“双重”:“应用程序”与“forall f”类型。可遍历的f =>(f a→b)→(f s→t)'。不知道有没有人想过这些。 – 2014-08-28 04:13:37
@ØrjanJohansen我不确定这是否与此有关,但[分配]中有一个“cotraverse”(http://hackage.haskell.org/package/distributive-0.4.4/docs/Data-Distributive。 HTML)。 – 2014-08-28 07:01:00
@AndrásKovács看起来很相关,我应该记住这一点。按照Kmett通常的命名方案,我所建议的(除了用'Functor',他认为就足够了)将是一个“cotraversal”。为了使问题中的类型实际上是“分布式”的,他们需要将'Double'变成一个类型参数。 – 2014-08-28 15:49:45