we can define other higher order functions such as map, filter and reverse에 의해 reduce
/foldl1
을 사용할 수 있음을 알 수 있습니다.flatmap/mapcat은 다른 고차 함수의 기초로 사용할 수있는 함수입니까?
(defn mapl [f coll]
(reduce (fn [r x] (conj r (f x)))
[] coll))
(defn filterl [pred coll]
(reduce (fn [r x] (if (pred x) (conj r x) r))
[] coll))
(defn mapcatl [f coll]
(reduce (fn [r x] (reduce conj r (f x)))
[] coll))
우리는 또한 foldr
의 관점에서이를 수행 할 수있는 것으로 보입니다. 여기에 map
및 filter
은 012:의 17:25로 표시됩니다.
(defn mapr [f coll]
(foldr (fn [x r] (cons (f x) r))
() coll))
(defn filterr [pred coll]
(foldr (fn [x r] (if (pred x) (cons x r) r))
() coll))
는 이제 이것을 설명 몇 가지 서류가 밝혀 :
BIRD - 건설 기능 프로그래밍 강좌 - 1988 https://www.cs.ox.ac.uk/files/3390/PRG69.pdf
허튼 - 배의 보편성과 표현력에 대한 튜토리얼 - 1999 http://www.cs.nott.ac.uk/~gmh/fold.pdf
이번 주에 누군가가 다음과 같이 들었습니다.
물론
flatmap
(mapcat
)은 근본적입니다. 높은 차원의 함수를 많이 표현할 수 있습니다.
여기에 map
이 mapcat으로 구현되었습니다.
=> (defn mymap [f coll] (mapcat (comp vector f) coll))
=> (mymap #(+ 1 %) (range 0 9))
(1 2 3 4 5 6 7 8 9)
하지만 내게는 인격적 인 느낌이 듭니다. 실제로 복싱 만하고지도 자체가 '기본'인지 여부를 판단하기 때문입니다.
이 마지막 예제가 다소 인공적인 것으로 느껴지는 이유는 mapcat이 이미지도 측면에서 정의되어 있기 때문입니다. 당신이 source for mapcat 보면 - 우리는 유사한 참조 :
(defn mapcat
[f & colls]
(apply concat (apply map f colls)))
그래서 위의 예는 단지 CONCAT을 반전하고 mapcat의 내부지도의 기본 정의를 재사용 - 나에게 어떤 인공 느낀다. 이제 mapcat이 다른 HOF를 정의하는 데 사용될 수 있다면 괜찮을 것입니다.하지만 어떻게 해야할지 모르겠습니다. 누군가가 그 방향으로 나를 가리킬 수 있기를 바랍니다.
내 질문 : 다른 고차원 함수의 기본으로 사용할 수있는 함수는 flatmap/mapcat입니까?
고마워요! HOF 구축 사례를 들려 주시겠습니까? – hawkeye
함수를 매개 변수로 사용하는 모든 함수는 고차 함수입니다. –