Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Transducers

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Alex Wheeler Alex Wheeler
November 15, 2017
68

 Transducers

Clojure Transducers

Avatar for Alex Wheeler

Alex Wheeler

November 15, 2017
Tweet

Transcript

  1. reusable • every new collection defines own version of map,

    filter, etc. • MyCollection->MyCollection (append list 1) • Channel->Channel (>! chan 1) • Sequence->Sequence (conj [] 1)
  2. intermediate collections (1..10).map { |x| x * 2 } .select

    { |x| x > 20 } .reduce { |sum, x| sum + x }
  3. (map inc [1 2 3 4 5 6]) => (2

    3 4 5 7) (filter even? [1 2 3 4 5 6]) => (2 4 6)
  4. (reduce (fn [result input] (conj result (inc input))) [] [1

    2 3 4]) (reduce (fn [result input] (if (even? input) (conj result input) result)) [] [1 2 3 4])
  5. (reduce (fn [result input] (conj result (inc input))) [] [1

    2 3 4]) (reduce (fn [result input] (if (even? input) (conj result input) result)) [] [1 2 3 4])
  6. map (reduce (fn [result input] (conj result (inc input))) []

    [1 2 3 4]) (reduce ((fn [f] (fn [result input] (conj result (f input)))) inc) [] [1 2 3 4])
  7. map (reduce (fn [result input] (conj result (inc input))) []

    [1 2 3 4]) (reduce ((fn [f] (fn [result input] (conj result (f input)))) dec) [] [1 2 3 4])
  8. filter (reduce (fn [result input] (if (even? input) (conj result

    input) result)) [] [1 2 3 4]) (reduce ((fn [predicate] (fn [result input] (if (predicate input) (conj result input) result))) even?) [] [1 2 3 4])
  9. (reduce (fn [result input] (if (even? input) (conj result input)

    result)) [] [1 2 3 4]) (reduce ((fn [predicate] (fn [result input] (if (predicate input) (conj result input) result))) odd?) [] [1 2 3 4])
  10. (reduce (fn [result input] (if (even? input) (conj result input)

    result)) [] [1 2 3 4]) (reduce ((fn [predicate] (fn [result input] (if (predicate input) (conj result input) result)))(fn [x] (< x 10))) [] [1 2 3 4])
  11. what’s the problem? (reduce ((fn [f] (fn [result input] (conj

    result (f input))) inc) [] [1 2 3 4]) (reduce ((fn [predicate] (fn [result input] (if (predicate input) (conj result input) even?) result))) [] [1 2 3 4])
  12. (reduce ((fn [f] (fn [result input] (conj result (f input)))

    inc) [] [1 2 3 4]) (reduce ((fn [predicate] (fn [result input] (if (predicate input) (conj result input) even?) result))) [] [1 2 3 4])
  13. (reduce ((fn [f] (fn [result input] (conj result (f input)))

    inc) [] [1 2 3 4]) (reduce ((fn [predicate] (fn [result input] (if (predicate input) (conj result input) even?) result))) [] [1 2 3 4])
  14. (reduce ((fn [f] (fn [result input] (conj result (f input)))

    inc) 0 [1 2 3 4]) (reduce ((fn [predicate] (fn [result input] (if (predicate input) (conj result input) even?) result))) 0 [1 2 3 4])
  15. (reduce ((fn [f] (fn [result input] (conj result (f input)))

    inc) stream [1 2 3 4]) (reduce ((fn [predicate] (fn [result input] (if (predicate input) (conj result input) even?) result))) stream [1 2 3 4])
  16. (reduce ((fn [f] (fn [result input] (conj result (f input)))

    inc) chan [1 2 3 4]) (reduce ((fn [predicate] (fn [result input] (if (predicate input) (conj result input) even?) result))) chan [1 2 3 4])
  17. (reduce ((fn [f] (fn [result input] (step result (f input)))

    inc) file [1 2 3 4]) (reduce ((fn [predicate] (fn [result input] (if (predicate input) (step result input) even?) result))) file [1 2 3 4])
  18. (defn mapping [f] (fn [step] (fn [result input] (step result

    (f input))))) (defn filtering [predicate] (fn [step] (fn [result input] (if (predicate input) (step result input) result))))
  19. (defn mapping [f] ;; fn to apply to each input

    (fn [step] (fn [result input] (step result (f input)))))
  20. (defn mapping [f] (fn [step] ;; reducing fn that moves

    reduction forward (fn [result input] (step result (f input)))))
  21. • mapping/filtering return transducers • Transducers are functions that accept

    a reducing (step) function and return a reducing function
  22. • Note to future self: Alex. Do not go to

    the next slide yet. Open vim and show the repl examples.
  23. • map, cat • mapcat, filter • remove, take •

    take-while, take-nth • drop, drop-while • replace, partition-by • partition-all, keep • keep-indexed, map-indexed • distinct, interpose • dedupe random-sample