전혀 제한이 없습니다! 타입 생성자에 대한 범주 이론적 기초를 배우기 시작했을 때,이 점은 나를 혼란스럽게했습니다. 우리는 그것을 얻을 것입니다. 그러나 먼저 혼란을 해결해 보겠습니다. 이 두 인용문 :
이러한 functor는 유형 생성자를 사용하여 생성 된 범주를 대상 범주로만 가질 수 있습니다.
과
어떤 범주를 가진 functors를 functor의 대상으로 생각할 수 있습니다. 예 : 모든 Haskell 유형의 범주
functor가 무엇인지 오해하고 있거나 최소한 용어를 잘못 사용하고 있음을 보여줍니다.
펑 터는 카테고리를 구성 하지 않습니다 . 펑 터는 범주 간 매핑 입니다. 펑 터는 소스 카테고리의 객체 및 형태 (유형 및 기능)를 대상 카테고리의 객체 및 형태로 가져옵니다.
이것은 functor가 실제로 객체 쌍 F_obj 에 대한 맵핑 과 형태 F_morph 에 대한 맵핑 이라는 한 쌍 의 맵핑 임을 의미합니다 . Haskell 에서 functor 의 객체 부분 F_obj 는 형식 생성자의 이름 (예 :) 이고, morphism 부분은 함수입니다 ( 해당 표현식에서 언급 한 항목을 정렬하는 것은 Haskell 컴파일러의 책임입니다 ). 따라서 우리는 그것이 functor 라고 말할 수 없습니다 . 단지의 조합 과는 펑터이다. 여전히 사람들은 악용 표기법을 남용합니다. 프로그래머 는 functor를 호출 하는 반면, 범주 이론가는 functor의 두 부분을 모두 나타내는 데 동일한 기호를 사용합니다.ListfmapfmapListListfmapList
또한 프로그래밍에서 거의 모든 펑 터는 endofunctors입니다 . 즉, 소스 및 대상 범주는 동일합니다. 언어의 모든 유형 범주입니다. 이 범주를 Type 이라고하겠습니다 . endofunctor F 의 유형 유형 매핑 T를 다른 유형 FT 와 함수 > S - T 다른 함수 FT -> FS . 이 매핑은 물론 functor 법률을 준수해야합니다.
사용 List예로서 : 우리는 타입 생성자가 List : Type -> Type, 그리고 기능을 fmap: (a -> b) -> (List a -> List b)함께 펑터를 형성하는 것이다. 티
정리할 마지막 요점이 있습니다. 쓰기는 List int하지 않습니다 만들 정수 목록의 새로운 유형입니다. 이 유형은 이미 존재 합니다. Type 카테고리의 객체였습니다 . List Int단순히 그것을 참조하는 방법입니다.
이제 functor가 유형을 말, Int또는으로 매핑 할 수없는 이유가 궁금 String합니다. 그러나 할 수 있습니다! 아이덴티티 펑터 만 사용하면됩니다. 범주 C 의 경우 항등 기능은 모든 객체를 자체에 매핑하고 형태를 자체에 매핑합니다. 이 매핑이 functor 법률을 만족하는지 확인하는 것은 간단합니다. Haskell에서 이것은 id : * -> *모든 유형을 자체에 매핑 하는 유형 생성자 입니다. 예를 들어로 id int평가됩니다 int.
또한 모든 유형을 단일 유형으로 매핑하는 상수 기능을 만들 수도 있습니다 . 예를 들어 functor ToInt : * -> *는 where ToInt a = int모든 유형에 대해 모든 형태 a를 정수 항등 함수에 매핑합니다. fmap f = \x -> x