# Difference between revisions of "99 questions/Solutions/17"

From HaskellWiki

< 99 questions | Solutions

(cleanup) |
|||

Line 3: | Line 3: | ||

Do not use any predefined predicates. |
Do not use any predefined predicates. |
||

− | Solution using take and drop: |
+ | Solution using <hask>take</hask> and <hask>drop</hask>: |

+ | |||

<haskell> |
<haskell> |
||

split xs n = (take n xs, drop n xs) |
split xs n = (take n xs, drop n xs) |
||

</haskell> |
</haskell> |
||

⚫ | |||

+ | Or even simpler using <hask>splitAt</hask>: |
||

+ | |||

+ | <haskell> |
||

+ | split = flip splitAt |
||

+ | </haskell> |
||

+ | |||

⚫ | |||

+ | |||

<haskell> |
<haskell> |
||

split :: [a] -> Int -> ([a], [a]) |
split :: [a] -> Int -> ([a], [a]) |
||

Line 18: | Line 25: | ||

The same solution as above written more cleanly: |
The same solution as above written more cleanly: |
||

+ | |||

<haskell> |
<haskell> |
||

split :: [a] -> Int -> ([a], [a]) |
split :: [a] -> Int -> ([a], [a]) |
||

Line 23: | Line 31: | ||

split (x:xs) n = let (f,l) = split xs (n-1) in (x : f, l) |
split (x:xs) n = let (f,l) = split xs (n-1) in (x : f, l) |
||

</haskell> |
</haskell> |
||

− | |||

− | Note that this function, with the parameters in the other order, exists as <hask>splitAt</hask>. |

## Revision as of 20:13, 15 July 2010

(*) Split a list into two parts; the length of the first part is given.

Do not use any predefined predicates.

Solution using `take`

and `drop`

:

```
split xs n = (take n xs, drop n xs)
```

Or even simpler using `splitAt`

:

```
split = flip splitAt
```

But these should clearly be considered "predefined predicates". Alternatively, we have the following recursive solution:

```
split :: [a] -> Int -> ([a], [a])
split [] _ = ([], [])
split l@(x : xs) n | n > 0 = (x : ys, zs)
| otherwise = ([], l)
where (ys,zs) = split xs (n - 1)
```

The same solution as above written more cleanly:

```
split :: [a] -> Int -> ([a], [a])
split xs 0 = ([], xs)
split (x:xs) n = let (f,l) = split xs (n-1) in (x : f, l)
```