ArrayListworks in Java; I have pretty much no clue how a
ListI get from a function will work (unless I look at that function's code, of course). The twist that Effes brings is that the binding is done based off of an object's specific composition, not based off its class. It's much more fluid.
That last post had various examples, but here's an interesting one: you can actually upcast an object's function resolution! Here's how:
data Loud; Animal; Cat Cat is Animal speak(c:Loud Animal) : String = "Stomp!" speak(c:Loud Cat) : String = "Meow!" getAnimal() : Animal = Loud Cat animal = getAnimal() // 1 loudAnimal = Loud animal // 2 speak(animal) speak(loudAnimal)
// 1, we get some sort of
Animal. We don't know what kind, but we don't need to because of polymorphism. As it happens, it's a
Loud Cat, which means it'll meow at us when we ask it to speak.
// 2, we take our animal and make it loud. The interesting thing to note here is that the animal already was loud, though the compiler doesn't know it: specifically, it was a
Loud Cat. But, since the compiler doesn't know that, it creates a new object, with new bindings. At that point, the only thing the compiler knows is that it's a
Loud Animal, so it binds it to the stomping version of
This behavior is a bit counterintuitive at first. By doing what most systems would call a no-op (I even said it would be, last month!), an object's behavior changes. Specifically, adding the
Loudtrait to an object that already had it ended up changing its function binding.
This may seem weird, but I'd like to give it a try. My
Incidentally, this rebinding would not happen if the operation was known to be a no-op at compile time:
getLoudAnimal() : Loud Animal = Loud Cat animal = getLoudAnimal() loudAnimal = Loud animal
Loud, so adding
Loudto it becomes a compile-time no-op, with no rebinding. While this particular example is silly, this use case is actually useful if the redundant trait has parameters that you'd like to change:
data Microchipped(id : Int) data Cat getAnimal() : Microchipped Animal = Microchipped(123) Cat animal1 = getAnimal() animal2 = Microchipped(456) animal1
Here, we're changing the animal's microchip id without having to worry about upcasting its function resolution.