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
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.

Ne'in modeli en iyi yolu bir takv...
Neden göster, fmap ve liftM var mı?...
Aynı elemanlı bir dizi oluşturmak java...
Tek bir Öğe Listesi oluşturmak Tekrarl...
Nasıl ArrayList tekrarlanan elemanları...