THRIFT-390. hs: Cabalize Haskell library code

Use Cabal to build and install the Haskell library code.



git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@763029 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lib/hs/README b/lib/hs/README
index 7cc2f00..5510de1 100644
--- a/lib/hs/README
+++ b/lib/hs/README
@@ -1,19 +1,62 @@
 Haskell Thrift Bindings
 
-Running: you need -fglasgow-exts.
+Running
+=======
 
-Enums: become haskell data types. Use fromEnum to get out the int value.
+You need -fglasgow-exts. Use Cabal to compile and install. If you're trying to
+manually compile or load via ghci, and you're using ghc 6.10 (or really if your
+default base package has major version number 4), you must specify a version of
+the base package with major version number 3. Furthermore if you have the syb
+package installed you need to hide that package to avoid import conflicts.
+Here's an example of what I'm talking about:
 
-Structs: become records. Field labels are ugly, of the form f_STRUCTNAME_FIELDNAME. All fields are Maybe types.
+  ghci -fglasgow-exts -package base-3.0.3.0 -hide-package syb -isrc Thrift.hs
 
-Exceptions: identical to structs. Throw them with throwDyn. Catch them with catchDyn.
+To determine which versions of the base package you have installed use the
+following command:
 
-Client: just a bunch of functions. You may have to import a bunch of client files to deal with inheritance.
+  ghc-pkg list base
 
-Interface: You should only have to import the last one in the chain of inheritors. To make an interface, declare a label:
-data MyIface = MyIface
-and then declare it an instance of each iface class, starting with the superest class and proceding down (all the while defining the methods).
-Then pass your label to process as the handler.
+All of this is taken care of for you if you use Cabal.
 
-Processor: Just a function that takes a handler label, protocols. It calls the superclasses process if there is a superclass.
+
+Enums
+=====
+
+become haskell data types. Use fromEnum to get out the int value.
+
+Structs
+=======
+
+become records. Field labels are ugly, of the form f_STRUCTNAME_FIELDNAME. All
+fields are Maybe types.
+
+Exceptions
+==========
+
+identical to structs. Throw them with throwDyn. Catch them with catchDyn.
+
+Client
+======
+
+just a bunch of functions. You may have to import a bunch of client files to
+deal with inheritance.
+
+Interface
+=========
+
+You should only have to import the last one in the chain of inheritors. To make
+an interface, declare a label:
+
+  data MyIface = MyIface
+
+and then declare it an instance of each iface class, starting with the superest
+class and proceding down (all the while defining the methods).  Then pass your
+label to process as the handler.
+
+Processor
+=========
+
+Just a function that takes a handler label, protocols. It calls the
+superclasses process if there is a superclass.