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

From HaskellWiki

< 99 questions | Solutions

Line 15: | Line 15: | ||

<haskell> |
<haskell> |
||

dupli xs = xs >>= (\x -> [x,x]) |
dupli xs = xs >>= (\x -> [x,x]) |
||

+ | </haskell> |
||

+ | |||

+ | or, using the list instance of <hask>Applicative</hask>: |
||

+ | <haskell> |
||

+ | duplicate = (<**> [id,id]) |
||

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

## Revision as of 20:42, 28 December 2014

(*) Duplicate the elements of a list.

```
dupli [] = []
dupli (x:xs) = x:x:dupli xs
```

or, using list comprehension syntax:

```
dupli list = concat [[x,x] | x <- list]
```

or, using the list monad:

```
dupli xs = xs >>= (\x -> [x,x])
```

or, using the list instance of `Applicative`

:

```
duplicate = (<**> [id,id])
```

or, using `concatMap`

:

```
dupli = concatMap (\x -> [x,x])
```

also using `concatMap`

:

```
dupli = concatMap (replicate 2)
```

or, using `foldl`

:

```
dupli = foldl (\acc x -> acc ++ [x,x]) []
```

or, using `foldr`

:

```
dupli = foldr (\ x xs -> x : x : xs) []
```

or, using silliness:

```
dupli = foldr (\x -> (x:) . (x:)) []
```

or, even sillier:

```
dupli = foldr ((.) <$> (:) <*> (:)) []
```

and here is the proof that `((.) <$> (:) <*> (:)) = (\y z -> y:y:z)`

:

```
(.) <$> (:) <*> (:) =
((.) <$> (:)) <*> (:) = -- (<$>) is infixl 4, (<*>) is infixl 4
((.) . (:)) <*> (:) = -- (<$>) == (.) for functions
(\x -> (.) (x:)) <*> (:) = -- definition of (.)
\y -> (\x -> (.) (x:)) y (y:) = -- definition of (<*>) for functions
\y -> ((.) (y:)) (y:) = -- beta reduction (applying y to (\x -> (.) (x:)))
\y -> (y:) . (y:) = -- changing (.) to its prefix form
\y -> (\z -> (y:) ((y:) z)) = -- definition of (.)
\y z -> y:y:z -- making it look nicer
```