James,
Thank you for your explanation. This was very helpful for me to get a better
understanding of some of the confusing nomenclature between Java and Scala, as
did the Moors, Piessens, Odersky paper that's been linked to previously
(http://www.cs.kuleuven.be/~adriaan/files/higher.pdf).
I believe I understand your example, but I'm not sure I see the major gain.
After all, the following is legal Java:
public class Util
{
public static <S, T> void map(Iterable<? extends S> source, Collection<?
super T> target, Transformer<S, T> trans)
{
for(S val : source)
target.add(trans.transform(val));
}
}
Yes, its clients will have to use perhaps 3 lines instead of 1. Is that what
this is really all about, or am I missing something?
Alexey
--- On Sat, 12/27/08, James Iry <[email protected]> wrote:
> From: James Iry <[email protected]>
> Subject: [The Java Posse] Re: Scala for the enterprise?
> To: "The Java Posse" <[email protected]>
> Date: Saturday, December 27, 2008, 12:45 PM
> Tony's um...debating style shouldn't be taken as
> reflecting the Scala
> community in general.
>
> To the topic at hand: Scala has only a few things are are
> genuinely
> foreign to Java programmers. For instance, except for
> non-local
> return, Scala's lambdas are really just a shortcut to
> writing certain
> kinds of anonymous inner classes and closures are just
> instances of
> them (people often use the word closure where they mean
> lambda -
> that's not really correct, but in general that's no
> more confusing
> than saying object where you mean class).
>
> Higher kinded types are one such fairly new thing. But if
> you step
> back they're just a logical extension to stuff Java
> programmers
> already know with regards to generics. And what they
> enable, in a
> nutshell, is better type specification and more code reuse.
>
> In Java, Foo, List<Foo>, and List<? extends
> Foo> are all types. As
> such, they are all suitable for substitution in X in
> "public <X> X
> doSomething(X x) {...}". Here we don't know what
> doSomething does
> exactly, but we do know that given a value of type X it
> returns a
> value of the same type X.
>
> But sometimes it's useful to change a type in certain
> well constrained
> ways. The example from the linked paper was
> "mapping" (not to be
> confused with the Java Map interface). Mapping means
> taking a
> container of type Container<Contained> and using a
> transformer on each
> element to return a container of type
> Container<NewContained>. In
> other words, take an ArrayList<String> and turn it
> into an
> ArrayList<Integer>, or take a Tree<Foo> and
> return a Tree<Bar>. Etc.
> The important part is the form of the container doesn't
> change, while
> the type of contained element changes according to the
> transformer.
>
> In Java you can't express that idea generically
>
> First, start with this interface
> interface Transformer<Arg, Result> {
> public Result transform(Arg arg);
> }
>
> With that, the following is not valid Java and there's
> no way to
> express it
>
> interface Mappable<Container<?>, Contained> {
> public <NewContained> Container<NewContained>
> map
> (Transformer<Contained, NewContained> transformer);
> }
>
> The best you can do in Java is
> interface Mappable<Contained> {
> public <NewContained> Mappable<NewContained>
> map
> (Transformer<Contained, NewContained> transformer);
> }
>
> Which just says that if, say, MySimpleContainer implemented
> Mappable
> then using its map method would return some arbitrary
> Mappable rather
> than another MySimpleContainer.
>
> In Scala, on the other hand, this is valid
> trait Mappable[Container[_], Contained] {
> def map[NewContained] (transformer :
> Transformer[Contained,
> NewContained]) : Container[NewContained]
> }
>
> class MySimpleContainer[T](x : T) extends
> Mappable[MySimpleContainer,
> T] {
> def map[NewContained](transformer :
> Transformer[Contained,
> NewContained) =
> new MySimpleContainer(transformer.transform(x))
> }
>
> So this says that MySimpleContainer's map returns
> another
> MySimpleContainer. Exactly what we want. Note that I
> don't need the
> Tranformer interface at all since that's just the same
> thing as a
> closure, but I wanted to keep the examples symmetrical.
> Also, while
> MySimpleContainer is a bit silly, the idea extends to
> lists, trees,
> dictionaries (maps), etc.
>
> At this point, all it seems that I've accomplished is a
> tighter type
> specification. Which is fine, but is it really that
> useful? Well, if
> you go on a bit further then if you have both a higher
> kinded
> Buildable interface and a higher kinded form of iteration,
> then you
> can write map once and reuse it.
>
> Long story short: higher kinded types allow you to more
> precisely
> specify what an interface means while also allowing greater
> reuse.
>
> On Dec 26, 10:52 am, Alexey Zinger
> <[email protected]> wrote:
> > This thread, while interesting at times, is getting
> difficult to follow, mainly due to it getting sidetracked
> like this. A simple observation: being smart is attractive
> (not just in a sexual way), while being smart and making
> sure everyone knows it is not nearly so. I'm not a
> computer scientist and most of my programming-related time
> is spent strongly swayed by pragmatic considerations. That
> said, I get the value of a good grasp on language theory, as
> it can open one's mind to new ideas and possibilities.
> So I'd love to hear more about Scala from that
> perspective, but I'd love to hear much much less about
> who thought of higher kinded types first and who got kicked
> out of an IRC channel when. Thanks, gents. Carry on.
> >
> > Alexey
> >
>
>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "The
Java Posse" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/javaposse?hl=en
-~----------~----~----~----~------~----~------~--~---