우리는 reduce
/foldl1
을 함수 by which we can define other higher order functions such as map, filter and reverse으로 사용할 수 있음을 알 수 있습니다.폴드 및 축소가 근본적인 이유 인 이유는 무엇입니까? 물론 모든 것이 단점과 자동차 측면에서 정의되어 있습니까?
(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로 표시됩니다. fold
와 왜
(defn foldr [f z xs]
(if (null? xs)
z
(f (first xs) (foldr f z (rest xs)))))
(defn foldl [f z xs]
(if (null? xs)
z
(foldl f (f z (first xs)) (rest xs))))
(defn map [f lst]
(if (null? lst)
'()
(cons (f (first lst)) (map f (rest lst)))))
내 질문이 입니다 :
(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))
이제 우리는 first
, rest
및 cons
(car
, cdr
및 cons
)의 측면에서 map
, foldl
(reduce
)와 foldr
정의 할 수 있습니다 reduce
은 기본으로 간주됩니다. 확실히 모든 것이 cons
, cdr
및 car
? 잘못된 레벨의 것들이 보이지 않습니까?
([바나나, 렌즈, 봉투 및 철조망과 기능 프로그래밍] http://wwwhome.ewi.utwente.nl/~fokkinga/mmf91m.pdf :
당신은이 논문에서 자세한 내용을보실 수 있습니다) 관련성이 있습니다. Clojure의 구현 방식이 있습니다. 그렇지만, 물건을 기술하는 수학적 방법도 있습니다. –
정말 그 주석에 감사드립니다. Matt - 우리가 분류 할 수있는 몇 개의 '빌딩 블록 시작 장소'가 있는지 궁금합니다. 어떤 사람들은 Lisp가 Maxwell의 방정식 인 http://www.michaelnielsen.org/ddi/lisp-as-the-maxwells-equations-of-software/라고 말하지만,이 Q & A의 주제는 '목록'을 만들고, 때때로 여러분은'fold'를 사용하여 비 목록 구조를 변형하려고합니다. – hawkeye
'cons','car','cdr'는 객관적인 의미에서 원시적이 아니기 때문에 모든 것을'λ '만으로 정의 할 수 있습니다. 그렇다면 왜 다른 것들 대신에이 세 가지의 특정 원시 연산으로 모든 것을 줄여 줄 것을 부탁드립니다. 그것은 모두 친척입니다. – amalloy