Temelde bir c-dizi float olan bir tür Image
var. , map :: (Float -> Float) -> Image -> Image
veya zipWith :: (Float -> Float -> Float) -> Image -> Image -> Image
gibi işlevler oluşturmak kolaydır. Bununla birlikte, ((+) <$> image1 <*> image2)
veya ((\x y z -> (x+y)/z) <$> i1 <*> i2 <*> i3)
gibi daha esnek piksel seviyesi manipülasyonlarına izin vererek, bu işlevlerin üzerine uygulamalı bir örnek gibi görünen bir şey sağlamanın da mümkün olacağını hissediyorum. Ancak, naif yaklaşım başarısızdır, çünkü görüntü tipi, şamandıralardan başka şeyler içeremez, bu nedenle fmap
'u uygulamak imkansız hale gelir.Bir functor olmadan uygulama
Bu nasıl uygulanabilir?
Neden bir Resim yüzen dışındaki şeyi içermesini izin vermedi? Tabii, ekranınız :: Görüntü Float -> IO() 'sadece float ile görüntü alabiliyordu, ancak 'map' gibi diğer fonksiyonlar için önemli değil. –
Görüntü türü, dönüşümler yapmak için çok fazla zaman harcamadan c işlevlerine geçirilmesi gereken bir c dizisidir. Ayrıca, fonksiyonlar gibi şeyleri tutabilseydi, “saf” olarak adlandırdıktan sonra birkaç milyon kısmi olarak değerlendirilen fonksiyona sahip olmanın, oldukça çirkin bir performans olacağını düşünürdüm. (Görüntülerin boyutlarını bilemediğinden, işlevlerin bir görüntüsünün olmasıyla 'pure' da sorunludur.) – aleator
türünüzü "type Image = CArray Float" gibi tanımlayabilir ve fritip ile CArray için bir Functor örneği oluşturabilirsiniz. –