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?
map
ve liftM
kesinlikle yapmalıyım tam olarak aynı şeyi fmap
.
fmap
ve yaparken , elbette sadece özel bir durum, yani farklı bir şey. iyi yazılmış, oysa değil. liftM
map
fmap id getLine
map id getLine
Yanıtlar:
map
Listeler ü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
fmap
ve liftM
Haskell'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 map
ve 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.
Functor
sı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?
liftM
ziyade bir do-block içinde kullanma eğilimindeyim , vb. yanı sıra. fmap
liftM2
--fwarn-amp
geçiş için mevcut kodun güncellenmesine yardımcı olacak yeni bir işarete sahiptir .