map :: (a -> b) -> [a] -> [b]
fmap :: Functor f => (a -> b) -> f a -> f b
liftM :: Monad m => (a -> b) -> m a -> m b
기본적으로 동일한 작업을 수행하는 세 가지 다른 기능이있는 이유는 무엇입니까?
답변
map
목록에 대한 작업을 단순화하고 역사적인 이유로 존재합니다 (fmap이있을 때 Haskell에서지도의 요점 은 무엇입니까? 참조 ).
별도의지도 기능이 필요한 이유를 물어볼 수 있습니다. 현재 목록 전용 맵 기능을 없애고 대신 fmap의 이름을 map으로 변경하지 않는 이유는 무엇입니까? 음, 좋은 질문입니다. 일반적인 주장은 방금 Haskell을 배우는 사람이 맵을 잘못 사용할 때 Functor에 대한 것보다 목록에 대한 오류를 보는 것이 훨씬 더 많다는 것입니다.
– Typeclassopedia , 페이지 20
fmap
그리고 liftM
모나드가 자동으로 하스켈에서 펑하지 않았기 때문에 존재한다 :
우리가 fmap과 liftM을 모두 가지고 있다는 사실은 수학적으로 말하면 모든 모나드는 functor이지만 Monad 유형 클래스에 Functor 인스턴스가 필요하지 않다는 사실의 불행한 결과입니다. 그러나 fmap과 liftM은 본질적으로 상호 교환이 가능합니다. 왜냐하면 어떤 유형이든 Functor의 인스턴스가되지 않고 모나드의 인스턴스가되는 것은 (기술적 인 의미가 아니라 사회적 의미에서) 버그이기 때문입니다.
– Typeclassopedia , 페이지 33
편집 : agustuss의 역사 map
및 fmap
:
그것은 실제로 일어나는 방식이 아닙니다. 무슨 일이 있었는지 맵의 유형이 Haskell 1.3의 Functor를 포함하도록 일반화되었습니다. 즉, Haskell 1.3에서는 fmap을 map이라고했습니다. 이 변경 사항은 Haskell 1.4에서 되돌려졌으며 fmap이 도입되었습니다. 이러한 변화의 이유는 교육적이었습니다. 초보자에게 하스켈을 가르 칠 때 매우 일반적인 유형의지도는 오류 메시지를 이해하기 더 어렵게 만들었습니다. 제 생각에는 이것은 문제를 해결하는 올바른 방법이 아닙니다.
– fmap 함수가있을 때 하스켈 맵의 포인트는 무엇입니까?