import Test.QuickCheck

f :: [Int] -> Int
f xs  =  foldr (+) 0 (map sqr (filter pos xs))
  where
  sqr x  =  x * x
  pos x  =  x > 0

f2 :: [Int] -> Int
f2 xs  =  foldr (+) 0 (map (\x -> x * x) (filter (\x -> x > 0) xs))

f3 :: [Int] -> Int
f3 xs  =  foldr (+) 0 (map (^ 2) (filter (> 0) xs))

f4 :: [Int] -> Int
f4  =  foldr (+) 0 . map (^ 2) . filter (> 0)

prop_f :: [Int] -> Bool
prop_f xs  =
  f xs == f2 xs &&
  f2 xs == f3 xs &&
  f3 xs == f4 xs

main :: IO ()
main =  quickCheck prop_f


