
Hi. You stack-overflow had good answers, I don't think I will shed new light on this. But still I will give it a try. On 16/10/15 04:32, martin wrote:
Hello all,
Suppose I have a type "Process" which stands either for a Train or a moving Belt. In both cases there is a place of departure and a place of arrival. However the other parameters which describe a Process differ. A Train has departure and arrival times, but a Belt has a speed.
I tried the following:
type PlaceDep = Int type PlaceArr = Int
data Process = Train PlaceDep PlaceArr TP | MovingBelt PlaceDep PlaceArr BP deriving (Eq, Show)
data TP = TP Int deriving (Eq, Show) data BP = BP Int deriving (Eq, Show)
You could use a newtype here. This is the intended use case of them as you want a semantically different type but an underlying same representation (and possible some instances of such representation). Something like this newtype TP = TP Int deriving (Eq, Show) newtype BP = BP Int deriving (Eq, Show)
prc1 = Train 10 11 (TP 1) prc2 = MovingBelt 12 13 (BP 2)
What I don't like about this is that the fact that all Processes have PlaceDep and PlaceArr appears somewhat "coincidental".
This in contrast, captures the common parts more clearly:
type PlaceDep = Int type PlaceArr = Int
data ProcessParams = DepartureTime Int | Speed Int deriving (Eq, Show)
data Process = Process PlaceDep PlaceArr ProcessParams deriving (Eq, Show)
prc1 = Process 10 11 (DepartureTime 1) prc2 = Process 12 13 (Speed 2)
This just seems a trade-off if you want to know with what are you dealing just matching the outer constructor or more of the problem won't care about it. Not really a dichotomy worth caring about much anyways
Is this the classic way of specializing a type or are there better options
I would just stick to sum types (the first approach) but I don't know the whole context of the problem. BTW "specializing a type" has a concrete meaning in haskell. It grabs a polymorphic function and gives it a more concrete type. An usual example is id :: a -> a id x = x id2 :: Char -> Char id2 c = id c which hopefully is clear on what I am going about