[Python-3000] Breakthrough in thinking about ABCs (PEPs 3119 and 3141) (original) (raw)

Jason Orendorff jason.orendorff at gmail.com
Tue May 1 06:32:04 CEST 2007


On 4/30/07, Guido van Rossum <guido at python.org> wrote:

The correct approach is for TotallyOrdered to be a metaclass (is this the typeclass thing in Haskell?).

Mmmm. Typeclasses don't feel like metaclasses. Haskell types aren't objects.

A typeclass is like an interface, but more expressive. Only an example has any hope of delivering the "aha!" here:

-- This defines a typeclass called "Set e". -- "e" and "s" here are type variables. class Set e s where -- here are a few that behave like OO methods... size :: s -> Int -- (size set) returns an Int contains :: s -> e -> Bool -- (contains set element) returns Bool

  -- here are some where the two arguments have to be of the same type
  union :: s -> s -> s
  intersection :: s -> s -> s

  -- here's a constructor!
  fromList :: [e] -> s

  -- and here's a constant... with a default implementation!
  emptySet :: s
  emptySet = fromList []

Suppose someone has written a super-fast data structure for collections of ints. If I wanted to "register" that type as a Set, I would write:

instance Set Int FastIntSet where -- the implementation goes in here size self = ...implement this using FastIntSet magic...

More complex relationships among types are surprisingly easy to express. See if you can puzzle these out:

instance Hashable e => Set e (HashSet e) where ...

instance Cmp e => Set e (TreeSet e) where ...

class PartialOrd t where (<=*) :: t -> t -> Bool

instance (Set s, Eq s) => PartialOrd s where (a <=* b) = (intersection a b == a)

See? It's nice. But, eh, this is what typeful languages do all day; they'd better be good at it. :)

-j

(Right now on a Haskell mailing list somewhere, a mirror image of me is trying to explain what's so cool about zipfile. Python wins. ;)



More information about the Python-3000 mailing list