
I am reading article "Fun with type functions" and I have a few questions regarding examples presented in it. Here is the code class Add a b where type SumTy a b add :: a -> b -> SumTy a b instance (Add Integer a) => Add Integer [a] where type SumTy Integer [a] = [SumTy Integer a] add x y = map (add x) y Here are my questions: 1. Is type "SumTy Integer [a]" visible outside 'Add' instance? 2. If yes, how would you create and instance of that type without using 'add' function? 3. Will function 'add x y' create the following structure [SumTy x y1, SumTy x y2, etc...]? If not, what is 'add x y' creates? 4. How to print the result of 'add x y'? Also, I understand the following "instance (Ord a) => Monad a where ...." as type of the 'a' must be an extension of type Ord. How shall I understand code below? "instance (Add Integer a) => Add Integer [a]" Thanks a lot.

On Tue, Jun 02, 2009 at 03:44:48PM -0400, Malik H wrote:
I am reading article "Fun with type functions" and I have a few questions regarding examples presented in it. Here is the code
class Add a b where type SumTy a b add :: a -> b -> SumTy a b
instance (Add Integer a) => Add Integer [a] where type SumTy Integer [a] = [SumTy Integer a] add x y = map (add x) y
Here are my questions: 1. Is type "SumTy Integer [a]" visible outside 'Add' instance?
Yes.
2. If yes, how would you create and instance of that type without using 'add' function?
Notice that the 'type' declaration just sets up an equality between types. So 'SumTy Integer [a]' is *the same as* [SumTy Integer a]. Now, what is 'SumTy Integer a'? Well, it depends on what a is. In the paper they give an example when a = Double, then SumTy Integer Double = Double. So we see that SumTy Integer [Double] = [SumTy Integer Double] = [Double]. So, since 'SumTy Integer [Double]' is really just a fancy way of saying [Double], you can create a value of that type in any way you would normally create a value of type [Double]. For example, [3.0, 2.9, 6.6] :: SumTy Integer [Double]
3. Will function 'add x y' create the following structure [SumTy x y1, SumTy x y2, etc...]? If not, what is 'add x y' creates?
No, SumTy is a function on *types*, and x and y are *values*. So saying 'SumTy x y1' does not make sense. Suppose x = 3 :: Integer y = [3.1, 2.9] :: [Double] then add x y = [6.1, 5.9] :: SumTy Integer [Double]
4. How to print the result of 'add x y'?
It depends on the type of x and y; but from above I hope you can see that there is nothing special about the values you get out of 'add'; the result of 'add' will just be a normal value whose type is determined by the 'SumTy' type function.
Also, I understand the following "instance (Ord a) => Monad a where ...."
as type of the 'a' must be an extension of type Ord. How shall I understand code below? "instance (Add Integer a) => Add Integer [a]"
This means that we can add an Integer to a list of a's, as long as we know how to add an Integer to something of type a. -Brent
participants (2)
-
Brent Yorgey
-
Malik H