Data constraint?

If I have a type type WaterChem = CaHardness NaturalChem | Alkalinity NaturalChem and I want to have the values of CaHardness and Alkalinity constrained to positive Int and between certain high and low values, I could do a newtype to creater a NaturalChem number, thus never less than 0, but what is the best practice to insure these values are between a certain range? Types in Haskell can't go that far, can they? Reading this https://www.haskell.org/tutorial/moretypes.html tells me I can have some of what I want. How are type values that need to be constrained handled best practices? Again, the type world of Haskell seems to do some of the lifting, but I'd like some advice if I want to have both of my constraints. -- ⨽ Lawrence Bottorff Grand Marais, MN, USA borgauf@gmail.com

Il 03 giugno 2021 alle 17:40 Galaxy Being ha scritto:
If I have a type
type WaterChem = CaHardness NaturalChem | Alkalinity NaturalChem
and I want to have the values of CaHardness and Alkalinity constrained to positive Int and between certain high and low values, I could do a newtype to creater a NaturalChem number, thus never less than 0, but what is the best practice to insure these values are between a certain range? Types in Haskell can't go that far, can they? Reading this
Mhhh you could create a smart constructor data Prova = ProvConst Int -- ProvConst does not get exported. mkProva :: Int -> Prova -- This does get exported. mkProva i | i > 100 = 100 -- or error "… ⁝ In a «Parse, don’t validate» [1] fashion. If you need (as I suspect) to operate on those values, you will need to define a few typeclasses (`numbers` [2] is a good example from Hackage). Would that do? —F [1] https://lexi-lambda.github.io/blog/2019/11/05/parse-don-t-validate/ [2] https://hackage.haskell.org/package/numbers-3000.2.0.2/docs/Data-Number-Natu...

Yes, I just discovered the HaskellWiki article on smart constructors! Will
give it a try.
On Fri, Jun 4, 2021, 11:01 AM Francesco Ariis
Il 03 giugno 2021 alle 17:40 Galaxy Being ha scritto:
If I have a type
type WaterChem = CaHardness NaturalChem | Alkalinity NaturalChem
and I want to have the values of CaHardness and Alkalinity constrained to positive Int and between certain high and low values, I could do a newtype to creater a NaturalChem number, thus never less than 0, but what is the best practice to insure these values are between a certain range? Types in Haskell can't go that far, can they? Reading this
Mhhh you could create a smart constructor
data Prova = ProvConst Int -- ProvConst does not get exported.
mkProva :: Int -> Prova -- This does get exported. mkProva i | i > 100 = 100 -- or error "… ⁝
In a «Parse, don’t validate» [1] fashion. If you need (as I suspect) to operate on those values, you will need to define a few typeclasses (`numbers` [2] is a good example from Hackage). Would that do? —F
[1] https://lexi-lambda.github.io/blog/2019/11/05/parse-don-t-validate/ [2] https://hackage.haskell.org/package/numbers-3000.2.0.2/docs/Data-Number-Natu... _______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
participants (2)
-
Francesco Ariis
-
Galaxy Being