2014-09-28 5 views
0

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의 관점에서이를 수행 할 수있는 것으로 보입니다. 여기에 mapfilter은 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입니까?

답변

0

mapmapcat을 생성하는 데 사용되는 프리미티브입니다.

mapcat을 사용하여 을 생성 할 수 있습니다. 이는 mapcat을 다시 작성하여 map으로 작성되었습니다.

둘 모두를 사용하여 무한대의 고차 함수를 작성할 수 있습니다.

+0

고마워요! HOF 구축 사례를 들려 주시겠습니까? – hawkeye

+0

함수를 매개 변수로 사용하는 모든 함수는 고차 함수입니다. –