Bohtvaroh

fix in Haskell

Jun 26th, 2013
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. {-# LANGUAGE ScopedTypeVariables #-}
  2.  
  3. import Data.Function (fix)
  4.  
  5. ffmap :: forall a b . (a -> b) -> [a] -> [b]
  6. ffmap f = fix ffmap'
  7.  where
  8.    ffmap' :: ([a] -> [b]) -> ([a] -> [b])
  9.     ffmap' _ [] = []
  10.    ffmap' r (x:xs) = f x : r xs
  11.  
  12. ffoldr :: forall a b . (a -> b -> b) -> b -> [a] -> b
  13. ffoldr f acc = fix ffoldr'
  14.  where
  15.    ffoldr' :: ([a] -> b) -> ([a] -> b)
  16.     ffoldr' _ [] = acc
  17.    ffoldr' r (x:xs) = x `f` r xs
  18.  
  19. ffoldl :: forall a b . (b -> a -> b) -> b -> [a] -> b
  20. ffoldl f acc = fix ffoldl'
  21.  where
  22.    ffoldl' :: ([a] -> b) -> ([a] -> b)
  23.     ffoldl' _ [] = acc
  24.    ffoldl' r (x:xs) = let f' = flip f in x `f'` r xs
  25.  
  26. fzip :: forall a b . [a] -> [b] -> [(a, b)]
  27. fzip = fix fzip'
  28.  where
  29.    fzip' :: ([a] -> [b] -> [(a, b)]) -> ([a] -> [b] -> [(a, b)])
  30.     fzip' _ [] ys = []
  31.    fzip' _ xs [] = []
  32.     fzip' r (x:xs) (y:ys) = (x, y) : r xs ys
  33.  
  34. fcycle :: forall a . [a] -> [a]
  35. fcycle xs = if null xs
  36.            then error "empty list"
  37.            else fix fcycle' $ xs
  38.   where
  39.     fcycle' :: ([a] -> [a]) -> ([a] -> [a])
  40.    fcycle' r [] = r xs
  41.     fcycle' r (y:ys) = y : r ys
  42.  
  43. fiterate :: forall a . (a -> a) -> a -> [a]
  44. fiterate f = fix fiterate'
  45.   where
  46.     fiterate' :: (a -> [a]) -> (a -> [a])
  47.    fiterate' r x = let x' = f x in x : r x'
  48.  
  49. frepeat :: forall a . a -> [a]
  50. frepeat = fix . (:)
Advertisement
Add Comment
Please, Sign In to add comment