3 ms·
Well, take this Clojure tutorial, for instance, comparing a simple DI implementation in Java with a single function in Clojure. The latter bears almost no rese
by sassafras 15y ago
Well, take this Clojure tutorial, for instance, comparing a simple DI implementation in Java with a single function in Clojure. The latter bears almost no resemblance to the former, other than achieving the desired effect. Is it fair to say that the user of a closure is implementing the Dependency Injection pattern, or is it a positive side effect of the fundamental properties of first class functions and lexical scope?
http://vimeo.com/10368175 http://vimeo.com/10368175
- fleitz 15y agoIMHO it's largely a side effect of first class functions. In Java in order to pass a function you need to pass an object that has the function, or an interface with the function, so it leads to a lot of line noise and thus people don't do it much. DI doesn't look impressive in a functional language because it's so well supported, but if you look at something like a global accumulator in a functional language you'll need a monad because you need state. eg in Java it's easier to write: int accum = 0; for(int i : collection){ accum +=i; } rather than collection.reduce(new IReduce<int> { int reduce(int accum, int i){ return i + accum; } }) I'm a bit rusty on Java so the syntax may be off but you get the idea, where as in a functional language (F#) that code is reduced to: collection |> Seq.reduce + Or in an imperative language that supports function passing (C#) collection.sum((a,b) => a+b)