[Haskell-cafe] Why functional programming matters
Mattias Bengtsson
moonlite at dtek.chalmers.se
Thu Jan 24 17:24:22 EST 2008
On Thu, 2008-01-24 at 21:11 +0000, Paul Johnson wrote:
[snip]
> // Get the Foo that was most recently updated.
> Foo latestUpdate (Iterator <Foo> iterator) {
[...]
> }
>
> This takes an iterator over some collection of Foos and finds the one
> with the highest value of updateTime. 9 lines of code, or 12 with the
> closing curly brackets.
>
> In Haskell this is so short and obvious you probably wouldn't bother
> declaring it as a function, but if you did, here it is:
>
> -- Find the Foo that was most recently updated.
> latestUpdate :: [Foo] -> Foo
> latestUpdate foos = maximumBy (comparing updateTime) foos
>
> Of course you could always write it in point-free format, but I think
> that would be over-egging things.
To have a fair comparison you'd have to use some typeclass (Foldable
would be right?) that supports different types of collections.
> import Data.Foldable as F
>
> latestUpdate :: Foldable a => [a] -> a
> latestUpdate = F.maximumBy (comparing updateTime)
But yeah your point is very very valid. I've programmed some Java in my
days and while i wouldn't call myself an expert i don't see any
immediate "unawkward" abstractions that can be performed in the java
code.
If you have all Foo's implement a method "getProperty(String)" that
takes a String and returns the property of that class instance you
_could_ implement the static method (correct java-lingo?)
maximumBy(String s) that is roughly like this:
class MyClass {
public static Foo maximumBy (Iterator <Foo> iterator, String s) {
long max = 0;
Foo maxFoo = Null;
while (iterator.hasNext()) {
item = iterator.getNext();
if (item.getProperty(s).compareTo(max)) {
max = item.updateTime;
maxFoo = item;
}
}
return maxFoo;
}
}
and then
Foo latestUpdate (Iterator <Foo> i) {
return MyClass.maximumBy(i,"latestUpdate");
}
Totally untested code ofcourse...
The awkward part obviously comes from the fact that properties aren't
functions that you can pass to the maximumBy-method.
Anyhow, Haskell's nice Polymorphism is surely a good argument for it
(but not for functional programming per se right?)
Mattias
More information about the Haskell-Cafe
mailing list