User loginNavigation |
archivesGADT vs. Type Classes
I'm looking for a paper or tutorial which compares/contrasts generalized algebraic data types and type classes (as found in GHC/Haskell). I get the feeling that they are some how duals of each other, and that there may be some overlap of the capabilities of each, but I don't know if I understand the essential differences which makes both desirable. For example, the standard GADT example of a tagless interpreter looks pretty similar to an equivalent built using type classes. In fact, the code for "
eval " is identical, only the type annotations differ. Any thoughts, comments?
...and here's a driver program which will work for either snippet...
The Type of 42The following is a reposting from my blog at http://www.artima.com/weblogs/viewpost.jsp?thread=182140. When I was designing Cat I started with the assumption that the type of a number such as 42, must be a function which pushes a primitive integer type onto the stack. So the type of 42 would be: 42 : ()->(int) The type of a function which yielded 42 would be: [42] : ()->(()->(int)) In Joy the operation for evaluating functions is "i". The equivalent in Cat is "eval". The type of eval in Cat currently is: eval : (A (A:any*)->(B:any*))->(B) This meant that the following was badly typed in Cat: 42 eval This is because eval expected a function on the top of the stack, but 42 produced a primitive on the top of the stack. You would have to instead write: [42] eval The decision for this type design was based on two things:
In assembly an operation which yields 42 and the value 42 are very different things. My thought was that I wanted to be able to trivially map Cat functions to assembly code. My concern is that the execution loop of an assembly program where values were executable would be non-trivial. I assumed you would need a switch statement and this would signficiantly hurt performance (Cat is striving to become a full competitor with real assembly code, so performance is a big concern). I am no longer convinced that this would actually be a problem. The first issue is writing the type of numbers. It appears that what is needed is the ability to name new types and express them recursively: 42 : int; int = ()->(int); The next challenge is converting to assembly code. I haven't worked out all of the details, but I believe that when generating assembly, I need to simply insert type conversion routines at key places (i.e. where an integer is being executed, or treated like a function). Do all this seem sane and rational? |
Browse archivesActive forum topics |
Recent comments
22 weeks 6 hours ago
22 weeks 10 hours ago
22 weeks 10 hours ago
44 weeks 1 day ago
48 weeks 3 days ago
50 weeks 18 hours ago
50 weeks 18 hours ago
1 year 4 days ago
1 year 5 weeks ago
1 year 5 weeks ago