Previous Contents Next

Chapter 4   The Edison Prelude

The EdisonPrelude module defines a few widely-used utility types and classes. It is imported by every other module in Edison, and by most clients. (It would be imported by all clients, except that many modules re-export the relevant prelude entries.) Currently, the EdisonPrelude defines two types in the Maybe family, and three classes related to hashing.
  data Maybe2 a b = Just2 a b | Nothing2
  data Maybe3 a b c = Just3 a b c | Nothing3

  class Eq a => Hash a where
    hash :: a -> Int
    -- forall x,y :: a. (x == y) implies (hash x == hash y)

  class Hash a => UniqueHash a
    -- no new methods, just a stronger invariant
    -- forall x,y :: a. (x == y) iff (hash x == hash y)

  class UniqueHash a => ReversibleHash a where
    unhash :: Int -> a
    -- forall x :: a. unhash (hash x) == x
The Maybe2 and Maybe3 types are used as the return types of functions that destructure a container, returning the element (or a key and element) together with the remaining container. The Hash classes are used to build functional analogs to traditional imperative hash tables.

This module will gradually be expanded to include utility functions on the Maybe2 and Maybe3 types, and perhaps a few other widely-used types or functions (such as warn).

Previous Contents Next