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ç fmap
bir 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 fmap
s 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 n
kat 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.
Tek bir Öğe Listesi oluşturmak Tekrarl...
Nasıl ArrayList tekrarlanan elemanları...
Çok tekrarlanan kod yönetimi ve Doküma...
'Haskell haritası anlamı ne, fmap...
Ne'in modeli en iyi yolu bir takv...