2015-10-12 25 views
8

A recent question!! ile listeye endekslenmesi, gerçekten yavaş yavaş bunu yapmak için kolay bir yolu var birPolimorfizmi bir veri yapısına nasıl aktarabilirim?

[ReifiedLens s t a b] 

içine

forall f . Functor f => [LensLike f s t a b] 

dönüştürmek için merak götürdü, ama oldukça inanılmaz var yetersiz. reflection'da kullanılana benzer bir numara çekmek için yeterli parametrikliğin olması gerektiği gibi hissettiriyor, ama hiçbir şey anlayamıyorum. Bunu verimli bir şekilde yapmak mümkün mü?

+2

Bunun bile mümkün olduğunu sanmıyorum. "Functor f -> [LensLike f s t a b]" ile [Functor f -> LensLike f s t a b] 'arasına gitmeliyiz. Başlamak için bir listeyi çıkarmak için bir 'Functor' f '' yapmalıyız ve bir tane yok. –

+2

@ AndrásKovács Belki de 'Functor f -> [LensLike f s t a b] 'tür işlevlerini anlamlı bir şekilde' Functor f' argümanını incelemeden sonuç listesinin uzunluğunu seçmesi gerektiğini kendimize ikna etmek için parametrik bir argüman kullanabiliriz. O zaman yolun geri kalanını oradan almak çok kolay. (Tabii ki bu iddia, 'F' türünde bir F 'için 'Functor F -> [LensLike Fs t a b]' tür fonksiyonlar için açıkça doğru değildir. –

+0

@ AndrásKovacs, bu benim korkumdu. Herhangi bir "Functor" sözlüğünün kimliğini sihirli bir şekilde alabileceğimiz, içinden geçebileceğimiz bir tür "süper oyuncu" sözüne ihtiyacımız var. – dfeuer

cevap

5

Test yorumlarında benim fikri gitti, sen aslında doğrudan ALens geçerek bu yazabilirsiniz:

convert :: (forall f. Functor f => [LensLike f s t a b]) -> [ReifiedLens s t a b] 
convert ls = [Lens (cloneLens l) | l <- ls] 

ALensPretext funktor dayanmaktadır:

type ALens s t a b = LensLike (Pretext (->) a b) s t a b 

newtype Pretext p a b t = Pretext { runPretext :: forall f. Functor f => p a (f b) -> f t } 

Bu kullanarak verir hepsini temsil etmek için en azından lens kullanımı için tek Functor.

Hala lensler için değil, genel olarak çalışan bir yöntem olup olmadığını merak ediyorum.

+0

Hala "Bahane" bataklığını buluyorum. '(->)' ye uygulandığı gibi, onu kısmen uygulanan bir lens olarak görebiliyorum, ancak faydası ve genelliği hala beni şaşırtıyor. – dfeuer

İlgili konular