
Hi Bryan, On Wed, Jan 16, 2013 at 03:10:18PM -0800, Bryan Vicknair wrote:
Ideally, the type system could do these checks, but we don't have dependent types so I kept looking. The pattern below uses the type system to force a client of the Circle data type to pass in valid (positive) radius. This isn't quite what is on the smart constructors wiki page. Does pattern have a name? Where can I read more about it? What are the negatives?
It's just a smart constructor. Instead of using one for Circle, you are now using one for ValidRadius. You still have the same pattern matching issue, because how would you access the radius inside of ValidRadius? But instead of using pattern matching to access the fields of Circle you could offer accessor functions. module Circle (Circle, Radius, circle, radius) where type Radius = Int data Circle = Circle Radius deriving (Eq, Show) circle :: Radius -> Maybe Circle circle r | r > 0 = Just $ Circle r | otherwise = Nothing radius :: Circle -> Radius radius (Circle r) = r Greetings, Daniel