[Haskell-cafe] Haskell and the Software design process

Rafael Cunha de Almeida assinante at kontesti.me
Mon May 3 08:10:55 EDT 2010


Ivan Miljenovic <ivan.miljenovic at gmail.com> disse:
> On 3 May 2010 14:17, aditya siram <aditya.siram at gmail.com> wrote:
>> I'm a little confused about this too. I've seen many functions defined like:
>> f x = (\s -> ...)
>> which is a partial function because it returns a function and is the same as:
>> f x s = ...
>
> No, that's a partially applied function.
>
> A partial function is one such as:
>
> secondElement (_:x:_) = x
>
> Note that it is only defined for lists with at least two elements, for
> any other list (i.e. singleton or empty) it will throw an error;
> -fwarn-incomplete-patterns (which is included in -Wall) tells you
> about these.
>
> You can also argue that functions such as head are partial, as they
> explicitly throw an error if the input data isn't correct.
>
> Partial functions are bad because if you accidentally use one the
> wrong way, your entire program crashes in a flaming wreck.  It's much
> better to do something like this:
>
> safeSecondElement (_:x:_) = Just x
> safeSecondElement _         = Nothing
>
> This will work with all possible input types.

I don't think that safeSecondElement is worse than secondElement. I think it's
better for the program to crash right away when you try to do something that
doesn't make sense.

Getting the secondElement of a list with one or less elements doesn't make
sense, so you are definetely doing something wrong if you expected the list to
have two elements, but it doesn't. It's best that the program crashes there,
than propagate the error and crash somewhere else or, worse, not crash at all
and give a wrong answer.


More information about the Haskell-Cafe mailing list