> Wow, I think you won the price of the longest post so far.
Well someone has to load-test this thing!
> And it is even a very clever one, actually.
Thanks :)
> having to use rep on annotated data is, I think, the biggest mistake of that type system.
This is exactly this problem that got me thinking about types. I've been tempted to create a few types with annotate already, but each time I stopped because I didn't want to have to reimplement every function to work on my new type. Each time, I found a different solution to the problem that didn't require new types, which started me thinking "hey, perhaps we don't need new types after all!"
But you're right that you'll always need new types eventually. The solution you suggested is, I think, the right one. It's a bit like the object system in ANSI Common Lisp (pg even used hash tables to store the object's methods!) but it uses annotate to associate methods with objects.
So I'll modify my position and say that you should avoid creating new types, but if you have to do it, duck typing is the way to go.