2016-10-23 3 views
2
차기를 들어

, 내가 map 내 자신의 버전을 쓰기로했다, 그러나 결국 제대로 lazy-seq을 사용하는 방법을 배우고 게으른지도를 만들기 위해 그것을 사용 게으른 시나리오에서 이상한 동작 ,하지만 내가 map에 대한 게으른 행동을 테스트했을 때, 나는 뭔가 다른 것으로 나타났습니다. 기능 번갈아 사용자 지정 맵 기능은

(defn print-map [description-str f coll mapping-f] 
    (mapping-f 
    (fn [x] 
     (do 
     (print (str description-str ":" x)) 
     (f x))) 
    coll)) 

I 표준 map 함수를 사용

이 요소가 한 번에 하나씩 처리된다 : I은 요소가 처리 될 때 인쇄 헬퍼 맵 기능을 사용하고

(defn -main [] 
    (let [m map 
     coll (into '() (range 10 0 -1)) 
     coll2 (print-map "A" identity coll m) 
     coll3 (print-map "B" identity coll2 m)] 
    (println (doall coll3)))) 

인쇄 각 번호가 나머지 요소가 어느 함수 보이는 제 전에 두 함수에 의해 처리되는 방법

A:1 B:1 A:2 B:2 A:3 B:3 A:4 B:4 A:5 B:5 A:6 B:6 A:7 B:7 A:8 B:8 A:9 B:9 A:10 B:10 (1 2 3 4 5 6 7 8 9 10) 

참고.

하지만 my-map-mainm를 변경하면, 처리 순서가 약간 변경 :

A:1 A:2 B:1 A:3 B:2 A:4 B:3 A:5 B:4 A:6 B:5 A:7 B:6 A:8 B:7 A:9 B:8 A:10 B:9 B:10 (1 2 3 4 5 6 7 8 9 10) 

지금 첫 번째 함수는 시작 두 번 실행되는 두 번째 기능은 결국 두 번 연속 실행하고, 결과적으로 매핑은 더 이상 "동기화"되지 않습니다.

my-map에 무슨 문제가 있습니까?

답변

4

my-map에서 파괴하면 게으른 순서로 next이 호출됩니다.

당신은 파괴한다하지 않음으로써이를 방지 할 수 있습니다

(defn my-map [f [x :as xs]] 
    #_(next xs) ;; uncomment to observere similar "broken" behaviour 
    (lazy-seq 
    (if x 
     (cons (f x) (my-map f (rest xs))) 
     (rest xs)))) 

;; You can find out what destructing does with this call: 
(destructure '[[x & r :as xs] numbers]) 

그리고 next is not as lazy as rest합니다.

+0

오. 고맙습니다. – Carcigenicate

관련 문제