3 ms·
Transducers are a different kind of thing, not just a generalized usage of enumerable functions. Clojure transducers are isomorphic to functions of type `a ->
by drostie 12y ago
Transducers are a different kind of thing, not just a generalized usage of enumerable functions.
Clojure transducers are isomorphic to functions of type `a -> [b]`, that is, functions which take some thing and return lists of other things. You can implement map and filter in this language:
tmap f a = [f a]
tfilter p a = if p a then [a] else []
You can also compose two such functions:
concat :: [[x]] -> [x]
concat [] = []
concat (x : xs) = x ++ concat xs
concatMap f list = concat (map f list)
compose lb_a lc_b = \a -> concatMap lc_b (lb_a a)
One reduction function (`foldr`) turns out to just be the identity function [a] -> [a], as I recall.
The interesting thing about Clojure transformers is that they have a strange continuation-passing form, such that this function `compose` that I wrote above for the type `a -> [b]` is actually in Clojure just a function composition. That is, instead of `a -> [b]` we see `forall r. (b -> r -> r) -> (a -> r -> r)`, which composes with normal function composition.