fmap이있을 때 Haskell에서지도의 요점은 무엇입니까?
내가 사용 해봤 모든 곳 map
, fmap
잘으로 일했다. Haskell의 제작자는 왜 map
함수 의 필요성을 느꼈 습니까? 그냥 현재로 알려진이 될 수 없습니다 fmap
및 fmap
언어에서 제거 할 수 있을까?
augustss의 댓글에 관심을 끌 수있는 답변을하고 싶습니다 .
그것은 실제로 일어나는 방식이 아닙니다. 무슨 일이 있었는지 맵의 유형이 Haskell 1.3의 Functor를 포함하도록 일반화되었습니다. 즉, Haskell 1.3에서는 fmap을 map이라고했습니다. 이 변경 사항은 Haskell 1.4에서 되돌려졌으며 fmap이 도입되었습니다. 이러한 변화의 이유는 교육적이었습니다. 초보자에게 하스켈을 가르 칠 때 매우 일반적인 유형의지도는 오류 메시지를 이해하기 더 어렵게 만들었습니다. 제 생각에는 이것은 문제를 해결하는 올바른 방법이 아닙니다.
Haskell 98은 일부 Haskeller (나 포함)에 의해 한 단계 뒤로 물러 난 것으로 간주되며, 이전 버전은보다 추상적이고 일관된 라이브러리를 정의했습니다. 오 잘.
https://wiki.haskell.org/Typeclassopedia#Functor 의 Functor
문서에서 인용
별도의
map
기능이 필요한 이유를 물어볼 수 있습니다 . 현재 목록 전용map
기능을 없애고 대신 이름fmap
을 변경 하지 않는 이유는 무엇map
입니까? 음, 좋은 질문입니다. 일반적인 주장은 방금 Haskell을 배우는 사람이map
잘못 사용 하면 about보다 목록에 대한 오류를 보게 될 것이라는 것Functor
입니다.
응용 프로그램 사이트에서는 동일하게 보이지만 물론 다릅니다. 당신이 그 두 가지 기능 중 하나에 적용하면 map
또는 fmap
값 목록에, 그들은 동일한 결과를 생성하지만 그는이 같은 목적을 위해 의미있는 것은 아닙니다.
GHCI 세션 (Glasgow Haskell Compiler Interactive)을 실행하여이 두 함수에 대한 정보를 쿼리 한 다음 구현을 살펴보면 많은 차이점을 발견하게됩니다.
지도
GHCI에 대한 정보를 쿼리하십시오. map
Prelude> :info map
map :: (a -> b) -> [a] -> [b] -- Defined in ‘GHC.Base’
모든 유형 a
의 값 목록을 생성하는 모든 유형의 값 목록에 적용 할 수있는 고차 함수로 정의 된 것을 볼 수 b
있습니다. (다형이지만 a
및 b
모든 유형의 상기 정의 스탠드로) map
기능이 적용되도록 의도 값에서 하스켈 많은 사람들 중에서 단지 하나의 가능한 데이터 형식이다. map
값 목록이 아닌 항목 에는 함수를 적용 할 수 없습니다.
GHC.Base 소스 코드 에서 읽을 수 있듯이 map
함수는 다음과 같이 구현됩니다.
map _ [] = []
map f (x:xs) = f x : map f xs
패턴 일치를 사용 하여 목록 x
의 꼬리 (the xs
) 에서 머리 (the )를 빼낸 다음 :
(cons) 값 생성자 를 사용하여 새 목록을 구성하여 앞에 추가합니다 f x
( "f에 적용됨" 로 읽음 ). map
목록이 비워 질 때까지 꼬리 위로 의 재귀에 . map
함수 의 구현이 다른 함수에 의존하지 않고 그 자체에만 의존 한다는 점은 주목할 가치가 있습니다.
fmap
이제에 대한 정보를 쿼리 fmap
하면 매우 다른 것을 볼 수 있습니다.
Prelude> :info fmap
class Functor (f :: * -> *) where
fmap :: (a -> b) -> f a -> f b
...
-- Defined in ‘GHC.Base’
이 시간 fmap
은 Functor
유형 클래스 에 속하려는 데이터 유형에 의해 구현이 제공되어야하는 함수 중 하나로 정의됩니다 . 이는 함수에 대한 구현을 제공 할 수있는 "값 목록" 데이터 유형 뿐만 아니라 둘 이상의 데이터 유형이있을 수 있음을 의미합니다 fmap
. 이는 fmap
훨씬 더 큰 데이터 유형 집합에 적용 할 수 있습니다. 실제로 펑터입니다!
GHC.Base 소스 코드 에서 읽을 수 있듯이 fmap
함수 의 가능한 구현은 Maybe
데이터 유형에서 제공하는 것입니다 .
instance Functor Maybe where
fmap _ Nothing = Nothing
fmap f (Just a) = Just (f a)
다른 가능한 구현은 2- 튜플 데이터 유형에서 제공하는 것입니다.
instance Functor ((,) a) where
fmap f (x,y) = (x, f y)
또 다른 가능한 구현은 목록 데이터 유형 (물론!)에서 제공하는 것입니다.
instance Functor [] where
fmap f xs = map f xs
which relies upon the map
function (note the point-free notation there ... but that's out of the scope of your original question).
Conclusion
The map
function can be applied to nothing more than list of values (where values are of any type) whereas the fmap
function can be applied much more data types: all of those which belongs to the functor class (e.g. maybes, tuples, lists, etc.). Since the "list of values" data type is also a functor (because it provides an implementation for it) then fmap
can be applied to is as well producing the very same result as map
.
map (+3) [1..5]
fmap (+3) (Just 15)
fmap (+3) (5, 7)
참고URL : https://stackoverflow.com/questions/6824255/whats-the-point-of-map-in-haskell-when-there-is-fmap
'Programing' 카테고리의 다른 글
-D_XOPEN_SOURCE의 기능 / 의미는 무엇입니까? (0) | 2020.09.04 |
---|---|
ASP.NET MVC 응용 프로그램에서보기 별 javascript 파일을 어디에 배치합니까? (0) | 2020.09.04 |
C ++ 11에서 난수 생성 : 생성 방법, 작동 원리 (0) | 2020.09.04 |
구분 기호가있는 String.Split (.net)의 반대 (0) | 2020.09.04 |
Django 1.7 및 데이터 마이그레이션으로 초기 데이터로드 (0) | 2020.09.04 |