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