Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

Higher kinds are quite nice.

1. In scala you could write

   class MyClass[A[_]](a: A) 
and it can only take a 'container' (List/Future/Option).

in C#/F# this is invalid:

    class MyClass<A<?>> {
            public MyClass(A a) {
             } 
    }
You could make a plain ol' generic that took a concrete type List<Int> but not just on the type.

2. Implicit Conversion: In C#/F# you get extension methods, but it doesn't help you take an existing class and ad-hoc make it implement an interface.

So in scala I could do this:

   trait XMLSerializable { 
      def toXML(): XMLNode
   }
   
and then let's say I want to make existing classes in the standard library implement this interface:

   implicit def toXMLSerializable(li: List[_]): XMLSerializable = 
   new XMLSerializable {
      def toXML = {
         transformListToXML(li)
      }
   }
I can now do:

    val genericXmlSerializable: XMLSerializable = List[Int](1,2,3,4)


Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: