map :: (a -> b) -> [a] -> [b]
fmap :: Functor f => (a -> b) -> f a -> f b
liftM :: Monad m => (a -> b) -> m a -> m b
Neden esasen aynı şeyi yapan üç farklı işleve sahibiz?
map :: (a -> b) -> [a] -> [b]
fmap :: Functor f => (a -> b) -> f a -> f b
liftM :: Monad m => (a -> b) -> m a -> m b
Neden esasen aynı şeyi yapan üç farklı işleve sahibiz?
mapve liftMkesinlikle yapmalıyım tam olarak aynı şeyi fmap.
fmapve yaparken , elbette sadece özel bir durum, yani farklı bir şey. iyi yazılmış, oysa değil. liftMmapfmap id getLinemap id getLine
Yanıtlar:
mapListeler üzerindeki işlemleri basitleştirmek için ve tarihsel nedenlerle mevcuttur (bkz . fmap varken Haskell'de haritanın amacı nedir? ).
Neden ayrı bir harita işlevine ihtiyacımız olduğunu sorabilirsiniz. Neden sadece listeye dayalı geçerli harita işlevini ortadan kaldırıp bunun yerine fmap'i eşlemek için yeniden adlandırmıyorsunuz? Bu güzel bir soru. Genel argüman, haritayı yanlış kullanarak Haskell'i yeni öğrenen birinin, Functors'dan çok listeler hakkında bir hata görmeyi tercih etmesidir.
- Typeclassopedia , Sayfa 20
fmapve liftMHaskell'de monadlar otomatik olarak işlev görmediği için var:
Hem fmap hem de liftM'ye sahip olmamız, matematiksel olarak konuşulsa bile, Monad türü sınıfın bir Functor örneği gerektirmemesinin talihsiz bir sonucudur, her monad bir functordur. Bununla birlikte, fmap ve liftM esasen birbirinin yerine kullanılabilir, çünkü (teknik anlamda değil sosyal anlamda) herhangi bir tipin aynı zamanda bir Functor örneği olmaksızın Monad'ın bir örneği olması için bir hatadır.
- Typeclassopedia , Sayfa 33
Düzenleme: agustuss'un tarihi mapve fmap:
Aslında böyle olmuyor. Haskell 1.3'te harita türünün Functor'u kapsayacak şekilde genelleştirilmesi oldu. Yani, Haskell'de 1.3 fmap harita olarak adlandırıldı. Bu değişiklik daha sonra Haskell 1.4'te geri alındı ve fmap kullanıma sunuldu. Bu değişikliğin nedeni pedagojikti; Haskell'i yeni başlayanlara öğretirken, çok genel bir harita türü hata mesajlarının anlaşılmasını zorlaştırdı. Kanımca sorunu çözmenin doğru yolu bu değildi.
Functorsınıf göz ardı edilemeyecek kadar yaygın olduğunu ve yeni başlayanlar genellikle zaten hata mesajları ile karıştı!
liftM? Bırakın kod kırılsın, kimin umurunda, kodun github'da düzeltilmesi ve ardından hackage'a yüklenmesi genellikle 2 günden az sürer. Yoksa çılgın ve çılgın mıyım?
liftMziyade bir do-block içinde kullanma eğilimindeyim , vb. yanı sıra. fmapliftM2
--fwarn-ampgeçiş için mevcut kodun güncellenmesine yardımcı olacak yeni bir işarete sahiptir .