Difference between revisions of "99 questions/Solutions/14"
From HaskellWiki
< 99 questions | Solutions
m |
|||
(7 intermediate revisions by 4 users not shown) | |||
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> | ||
+ | dupli = (<**> [id,id]) | ||
</haskell> | </haskell> | ||
Line 36: | Line 41: | ||
dupli = foldr (\ x xs -> x : x : xs) [] | dupli = foldr (\ x xs -> x : x : xs) [] | ||
</haskell> | </haskell> | ||
+ | |||
+ | or, using silliness: | ||
+ | <haskell> | ||
+ | dupli = foldr (\x -> (x:) . (x:)) [] | ||
+ | </haskell> | ||
+ | |||
+ | or, even sillier: | ||
+ | <haskell> | ||
+ | dupli = foldr ((.) <$> (:) <*> (:)) [] | ||
+ | </haskell> | ||
+ | |||
+ | and here is the proof that <hask>((.) <$> (:) <*> (:)) = (\y z -> y:y:z)</hask>: | ||
+ | |||
+ | <haskell> | ||
+ | (.) <$> (:) <*> (:) = | ||
+ | ((.) <$> (:)) <*> (:) = -- (<$>) 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 | ||
+ | </haskell> | ||
+ | |||
+ | |||
+ | [[Category:Programming exercise spoilers]] |
Latest revision as of 20:45, 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
:
dupli = (<**> [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