
On 2015-12-21 10:40, martin wrote:
I was trying to model things which can contain other things. This is easy as long as containers and the contained items all can be described in the same fashion. However when I want to model - say -
trucks containing boxes containing parcels containing cans
and trucks, boxes, parcels and cans are not of the same type, then this nested thing will become a type in its own right and it will be of a different type than trucks containing cans (which are not wrappen in parcels ...)
As long as I can squeeze trucks, boxes ... into one type, possibly by using a "container_type" attribute, there is no problem. Is this the only way to do this? Is there an idiom?
In addition to what the others wrote (I'd personally probably start with the 'data Truck a = Truck [a]' idea) you could also use the type system to express the possible *legal* ways to nest the load of a truck, e.g.: -- A Can can't contain anything data Can = Can -- A Parcel consists of zero or more cans data Parcel = Parcel [Can] -- A Box can be empty or contain a mixture of cans and parcels data BoxContent = BCCan Can | BCParcel Parcel data Box = Box [BoxContent] -- A Truck can be empty or contain a mixture of cans, parcels and boxes data TruckConent = TCCan Can | TCParcel Parcel | TCBox Box data Truck = Truck [TruckContent] This might be too annoying to deal with though, i.e. the gain of type safety is not big enough to actually follow this path. -- Frerich Raabe - raabe@froglogic.com www.froglogic.com - Multi-Platform GUI Testing