Diyelim ki bir kayıt listesi var ve bunu medyanı alarak özetlemek istiyorum. Daha somut olarak, ben ölçümlerin bir listesi var ve ben bir medyan Location
içine özetlemek istiyorum, bu yüzden bir şey gibiHaskell kayıtlarının bir listesini özetleyin
data Location = Location { x :: Double, y :: Double }
olduğunu varsayalım: gayet
Location (median (map x measurements)) (median (map y measurements))
ama ne olursa Ben CampusLocation
s listesi var ve ben ortanca herkese yinelemeli uygulanan bir özetini CampusLocation
, istediğiniz
data CampusLocation = CampusLocation { firstBuilding :: Location
,secondBuilding :: Location }
gibi daha fazla iç içe şey var alanlar.
Bunu Haskell'de yapmanın en temiz yolu nedir? Lensler? Uniplate?
Düzenleme: Bonus: yerine biz özetlemek istediğiniz alanları içeren bir kaydın olmadığını, bunun yerine örtük bir liste vardı ne
? Örneğin:
data ComplexCampus = ComplexCampus { buildings :: [Location] }
nasıl buildings
her aynı uzunlukta olduğunu varsayarak, bir ComplexCampus
içine [ComplexCampus]
özetleyebiliriz?
I istersek aniden bu tür bir şeyi hayal eden bir "iki" mercek geçişi sığacak: "forall f" ile "applicals". Traversable f => (f a -> b) -> (f s -> t) '. Henüz kimsenin düşünmediği bir şey yok. –
@ ØrjanJohansen Bu konuyla ilgili olup olmadığından emin değilim, ancak [dağıtıcı] 'da bir "kotraverse" var (http://hackage.haskell.org/package/distributive-0.4.4/docs/Data-Distributive. html). –
@ AndrásKovács Uygun görünüyor ve bunu hatırlamam gerekirdi. Kmett'in olağan adlandırma şemasının önerdiği gibi ('Functor', onun yeterli olduğunu söyleyenler hariç) o zaman bir "kotraversal" olurdu. Soruyu aslında 'dağıtma' türünde yapmak için, 'Çifte'yi bir tür parametresine dönüştürmeleri gerekir. –