# Difference between revisions of "Avoiding partial functions"

From HaskellWiki

(first examples: head, tail, !!) |
(irrefutable pattern match on (:)) |
||

Line 39: | Line 39: | ||

This is also more lazy, since for computation of <hask>length</hask> you have to visit every element of the list. |
This is also more lazy, since for computation of <hask>length</hask> you have to visit every element of the list. |
||

+ | |||

+ | |||

+ | == irrefutable pattern match on (:) == |
||

+ | |||

+ | You should replace |
||

+ | <haskell> |
||

+ | if k < length xs |
||

+ | then let (prefix,x:suffix) = splitAt k xs |
||

+ | in g prefix x suffix |
||

+ | else y |
||

+ | </haskell> |
||

+ | by |
||

+ | <haskell> |
||

+ | case splitAt k xs of |
||

+ | (prefix,x:suffix) -> g prefix x suffix |
||

+ | (_,[]) -> y |
||

+ | </haskell> |

## Revision as of 11:37, 5 June 2012

There are several partial functions in the Haskell standard library. If you use them, you always risk to end up with an undefined. In this article we give some hints how to avoid them, leading to code that you can be more confident about.

For a partial function f the general pattern is: Whereever we write "check whether x is in the domain of f before computing f x", we replace it by combination of check and computation of f.

## head, tail

You should replace

```
if null xs
then g
else h (head xs) (tail xs)
```

by

```
case xs of
[] -> g
y:ys -> h y ys
```

## (!!)

You should replace

```
if k < length xs
then xs!!k
else y
```

by

```
case drop k xs of
x:_ -> x
[] -> y
```

This is also more lazy, since for computation of `length`

you have to visit every element of the list.

## irrefutable pattern match on (:)

You should replace

```
if k < length xs
then let (prefix,x:suffix) = splitAt k xs
in g prefix x suffix
else y
```

by

```
case splitAt k xs of
(prefix,x:suffix) -> g prefix x suffix
(_,[]) -> y
```