[Haskell-beginners] Further constraining types
Christopher Howard
christopher.howard at frigidcode.com
Fri Aug 5 04:52:03 CEST 2011
On 08/04/2011 12:03 AM, David Virebayre wrote:
> 2011/8/4 Christopher Howard<christopher.howard at frigidcode.com>:
>> On 08/03/2011 09:23 PM, Brandon Allbery wrote:
>
>> This seems like a really significant issue for a functional programming
>> language. Am I eventually going to have to switch to Agda? My friends are
>> trying to convert me...
>
> I don't know Agda and what dependent type guarantee, but I don't see
> how they would prevent a user typing '-123' where you expect a
> positive number, so one way or another you will have to deal with
> input at runtime.
>
> Once you've validated your user input though, nothing prevents you to
> have it return a Positive Int that you will guarantee can hold only
> positive integers, for example by using a smart constructor, and
> hiding the contructor in a separate module. You don't need dependant
> types for this.
>
> David.
>
But users are not the only source of ints. For example, let's say I
wanted to do my own square function, with a type like so:
square :: Int -> Positive Int
So, I use the special constructor function in the implementation:
square x = validatePositive $ x * x
Great! now I have a function that returns Positive Ints, which can be
fed into any function that takes a Positive Int as its parameter.
Problem, though... how do I implement this special constructor in a way
that meets the criteria for completeness that I outlined earlier? A
validation function, by definition, allows for the possibility of
invalidation. So the type would have to be:
validatePositive :: Int -> Maybe (Positive Int)
But this means the type of square would have to be changed to
square :: Int -> Maybe (Positive Int)
...which is unacceptable. (I /know/ square /will/ always return an
positive integer, not that it /might/ do so!)
I could of course throw a "maybe"-style forced cast into the square
function, but that would defeat one of the fundamental principles of
what I'm trying to accomplish here.
Anyway, I think Brandon is right and the answer is in dependent types,
though to be honest I'm having real trouble decoding any of the
literature I've found so far.
--
frigidcode.com
theologia.indicium.us
More information about the Beginners
mailing list