If a thing can be done, then it WILL be done, there's always going to be
somebody out there perverse enough to try it
Almost any tool is open to abuse.  The more flexible it is, the more
abusable it becomes:

http://thereifixedit.failblog.org/

C++ templates for example, while a long time favourite of obfuscation
contests, have also resulted in some amazing work:
http://www.boost.org/doc/libs/


You'll not be surprised to hear that Scala's type system is no different in
this regard.

Broadly speaking, there are two important concepts really being explored by
more experienced Scala users; Google on either of these terms with scala,
and you'll come up with a wealth of links:

"type classes" : http://en.wikipedia.org/wiki/Type_class
<http://en.wikipedia.org/wiki/Type_class>and "kinds" :
http://en.wikipedia.org/wiki/Kind_(type_theory)


One example of a type class is scala.Numeric, which allows you to define an
algorithm in such a way that it'll operate over ANY type capable of a few
simple operations (plus, minus, divide, etc.) and do so in a completely
type-safe manner, without need of duck typing, etc.

This is an EXTREMELY powerful abstraction, once you consider that concepts
such as matrices, complex numbers, waveforms, linear equations, etc. can all
be added/subtracted/whatever and so can be considered Numeric.


Kinds are one level of abstraction up from types.  For example, List can be
seen as a Kind * -> * i.e. it takes a type (e.g. Int) and yields a type
(e.g. List[Int]).  Map is * -> * -> * (takes two types, and yields one).  In
terminology, you'll often see List described as a type constructor, whereas
List[Int] is a Type.  List is absolutely not a raw type, Scala doesn't have
such things!

Scala allows you to generically define an algorithm so that it'll operate
over a particular Kind (not just a specific type).
scalaz, for example, defines a number of operations that can operate over
anything of kind * -> *
http://scalaz.googlecode.com/svn/continuous/latest/browse.sxr/scalaz/MA.scala.html
(disclaimer: This is bleeding edge, brain melting, academic stuff of the
sort that scares people off, it is absolutely NOT day-to-day Scala so please
don't let it put you off!  It does however show how far things can be pushed
if you are so minded, not unlike C++ templates then)


And a few more interesting links, hopefully a lot more approachable than
scalaz :)


Quick interview with Bill Venners and Martin Odersky:
http://www.artima.com/scalazine/articles/scalas_type_system.html

Collection of articles on metaprogramming with types:
http://apocalisp.wordpress.com/2010/06/08/type-level-programming-in-scala/

presentation on type classes:
http://lampwww.epfl.ch/~odersky/talks/wg2.8-boston06.pdf

Generics of a Higher Kind:
http://people.cs.kuleuven.be/~adriaan.moors/files/genericshk/tcpoly.pdf

video and slides on "High wizardry in the Land of Scala", covering type
classes and Kinds::
http://vimeo.com/13518456

SO question illustrating a practical application of the Numeric type class:
http://stackoverflow.com/questions/1252915/scala-how-to-define-generic-function-parameters





2010/9/2 Cédric Beust ♔ <[email protected]>

>
>
> On Thu, Sep 2, 2010 at 2:20 PM, Graham Allan 
> <[email protected]>wrote:
>
>> One thing that the page doesn't include (AFAICT) is a discussion of what
>> you
>> have referred to elsewhere on this mailing list as a 'Turing-complete type
>> system'.
>>
>
> It's the kind of feature that enables hacks such as this 
> one<http://en.wikibooks.org/wiki/C%2B%2B_Programming/Templates/Template_Meta-Programming>.
> If you don't feel like reading it, somebody managed to create C++ templates
> which, when fed to the compiler, will produce error messages that list prime
> numbers.
>
> It's awesomely clever but why you would put this as a requirement to
> choosing a language is beyond me. If you don't think that this makes a
> language complex, you are probably hanging out with people who love Haskell
> and who can tell you the difference between a catamorphism and an
> anamorphism in their sleep.
>
> --
> Cédric
>
>
>


-- 
Kevin Wright

mail / gtalk / msn : [email protected]
pulse / skype: kev.lee.wright
twitter: @thecoda

-- 
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.

Reply via email to