SORU
5 Ocak 2012, PERŞEMBE


Tekrarlanan fmap ile eğlenceli

Etrafında funktorlar ile oynuyordum, ve ilginç bir şey fark ettim:

Basit, id tip (a -> b) -> a -> b örneği.

Listeyi biz functor ile map aynı fmap :: (a -> b) -> [a] -> [b],.

((->) r) eşleme (Control.Monad.Instances) durumunda, fmap kompozisyon fonksiyonudur, yani (map . map) denk fmap fmap fmap :: (a -> b) -> [[a]] -> [[b]], örneğini verebiliriz.

İlginç olan, fmap sekiz kez ABD (map . map . map) veriyor!

Var

0: id = id
1: fmap = map
3: fmap fmap fmap = (map . map)
8: fmap fmap fmap fmap fmap fmap fmap fmap = (map . map . map)

Bu desen devam ediyor mu? Neden/neden olmasın? Orada kaç fmapbir işlevi göster gerekiyor ler için bir formüln-kat iç içe geçmiş listesi?

Bir çözüm aramak için bir test komut dosyası yazmaya çalıştımn = 4dava, ama DZD 40 fmaps civarında çok fazla bellek yemeye başlar.

CEVAP
5 Ocak 2012, PERŞEMBE


Nedenini açıklayamam, ama burada döngüsü kanıtı

k >= 2 Fx bilinmeyen/Functor keyfi için standları fmap^(4k) :: (a -> b) -> F1 F2 F3 a -> F1 F2 F3 b, varsayalım. fmap^n fmap 26* fmap*s nkat değil tekrarında uygulanan anlamına gelir. İndüksiyon başlangıç el veya sorgulama ghci tarafından doğrulanabilir.

fmap^(4k 1) = fmap^(4k) fmap
fmap :: (x -> y) -> F4 x -> F4 y

bir ile birleşme ->b a = x -> y, b = F4 x -> F4 y, verim

fmap^(4k 1) :: F1 F2 F3 (x -> y) -> F1 F2 F3 (F4 x -> F4 y)

Şimdi, fmap^(4k 2) (a -> b) -> F5 a -> F5 b F1 F2 F3 (x -> y) birleştirmek zorundayız.
Böylece F1 = (->) (a -> b) F2 F3 (x -> y) F5 a -> F5 b ile birleştirilmiş olmalıdır.
Dolayısıyla F2 = (->) (F5 a) F3 (x -> y) = F5 b, yani F5 = F3 b = x -> y. Sonucudur

fmap^(4k 2) :: F1 F2 F3 (F4 x -> F4 y)
             = (a -> (x -> y)) -> F3 a -> F3 (F4 x -> F4 y)

fmap^(4k 3) (m -> n) -> F6 m -> F6 n), a = m -> n veren a -> (x -> y) birleştirmek zorundayız
x = F6 m y = F6 n, o kadar

fmap^(4k 3) :: F3 a -> F3 (F4 x -> F4 y)
             = F3 (m -> n) -> F3 (F4 F6 m -> F4 F6 n)

Son olarak, (a -> b) -> F7 a -> F7 b F3 = (->) (a -> b), m = F7 a n = F7 b bu nedenle F3 (m -> n) birleştirmek zorundayız

fmap^(4k 4) :: F3 (F4 F6 m -> F4 F6 n)
             = (a -> b) -> (F4 F6 F7 a -> F4 F6 F7 b)

ve tam bir döngü tamamlanmıştır. Elbette sonuç sorgulama ghci izler, ama belki türetme nasıl çalıştığı hakkında biraz ışık tutuyor.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • fireflame65

    fireflame65

    27 Mart 2007
  • Kamikazeepanda

    Kamikazeepan

    5 ŞUBAT 2006
  • Kevin Bruckert

    Kevin Brucke

    30 Aralık 2006