Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- {-# LANGUAGE ScopedTypeVariables #-}
- import Data.Function (fix)
- ffmap :: forall a b . (a -> b) -> [a] -> [b]
- ffmap f = fix ffmap'
- where
- ffmap' :: ([a] -> [b]) -> ([a] -> [b])
- ffmap' _ [] = []
- ffmap' r (x:xs) = f x : r xs
- ffoldr :: forall a b . (a -> b -> b) -> b -> [a] -> b
- ffoldr f acc = fix ffoldr'
- where
- ffoldr' :: ([a] -> b) -> ([a] -> b)
- ffoldr' _ [] = acc
- ffoldr' r (x:xs) = x `f` r xs
- ffoldl :: forall a b . (b -> a -> b) -> b -> [a] -> b
- ffoldl f acc = fix ffoldl'
- where
- ffoldl' :: ([a] -> b) -> ([a] -> b)
- ffoldl' _ [] = acc
- ffoldl' r (x:xs) = let f' = flip f in x `f'` r xs
- fzip :: forall a b . [a] -> [b] -> [(a, b)]
- fzip = fix fzip'
- where
- fzip' :: ([a] -> [b] -> [(a, b)]) -> ([a] -> [b] -> [(a, b)])
- fzip' _ [] ys = []
- fzip' _ xs [] = []
- fzip' r (x:xs) (y:ys) = (x, y) : r xs ys
- fcycle :: forall a . [a] -> [a]
- fcycle xs = if null xs
- then error "empty list"
- else fix fcycle' $ xs
- where
- fcycle' :: ([a] -> [a]) -> ([a] -> [a])
- fcycle' r [] = r xs
- fcycle' r (y:ys) = y : r ys
- fiterate :: forall a . (a -> a) -> a -> [a]
- fiterate f = fix fiterate'
- where
- fiterate' :: (a -> [a]) -> (a -> [a])
- fiterate' r x = let x' = f x in x : r x'
- frepeat :: forall a . a -> [a]
- frepeat = fix . (:)
Advertisement
Add Comment
Please, Sign In to add comment