Commit ac43cdb2 authored by sewardj's avatar sewardj
Browse files

[project @ 1999-04-27 14:13:01 by sewardj]

Firstified a few common fns for a modest performance gain,
ie,   elem = any . (==)     ===>    directly recursive version.
parent 76bd4168
......@@ -419,11 +419,10 @@ f =<< x = x >>= f
-- Evaluation and strictness ------------------------------------------------
seq :: a -> b -> b
seq x y = --case primForce x of () -> y
primSeq x y
seq x y = primSeq x y
($!) :: (a -> b) -> a -> b
f $! x = x `seq` f x
f $! x = x `primSeq` f x
-- Trivial type -------------------------------------------------------------
......@@ -1095,16 +1094,26 @@ null (_:_) = False
(x:xs) ++ ys = x : (xs ++ ys)
map :: (a -> b) -> [a] -> [b]
map f xs = [ f x | x <- xs ]
--map f xs = [ f x | x <- xs ]
map f [] = []
map f (x:xs) = f x : map f xs
filter :: (a -> Bool) -> [a] -> [a]
filter p xs = [ x | x <- xs, p x ]
--filter p xs = [ x | x <- xs, p x ]
filter p [] = []
filter p (x:xs) = if p x then x : filter p xs else filter p xs
concat :: [[a]] -> [a]
concat = foldr (++) []
--concat = foldr (++) []
concat [] = []
concat (xs:xss) = xs ++ concat xss
length :: [a] -> Int
length = foldl' (\n _ -> n + 1) 0
--length = foldl' (\n _ -> n + 1) 0
length [] = 0
length (x:xs) = let n = length xs in primSeq n (1+n)
(!!) :: [b] -> Int -> b
(x:_) !! 0 = x
......@@ -1220,19 +1229,34 @@ unwords [] = []
unwords ws = foldr1 (\w s -> w ++ ' ':s) ws
reverse :: [a] -> [a]
reverse = foldl (flip (:)) []
--reverse = foldl (flip (:)) []
reverse xs = ri [] xs
where ri acc [] = acc
ri acc (x:xs) = ri (x:acc) xs
and, or :: [Bool] -> Bool
and = foldr (&&) True
or = foldr (||) False
--and = foldr (&&) True
--or = foldr (||) False
and [] = True
and (x:xs) = if x then and xs else x
or [] = False
or (x:xs) = if x then x else or xs
any, all :: (a -> Bool) -> [a] -> Bool
any p = or . map p
all p = and . map p
--any p = or . map p
--all p = and . map p
any p [] = False
any p (x:xs) = if p x then True else any p xs
all p [] = True
all p (x:xs) = if p x then all p xs else False
elem, notElem :: Eq a => a -> [a] -> Bool
elem = any . (==)
notElem = all . (/=)
--elem = any . (==)
--notElem = all . (/=)
elem x [] = False
elem x (y:ys) = if x==y then True else elem x ys
notElem x [] = True
notElem x (y:ys) = if x==y then False else notElem x ys
lookup :: Eq a => a -> [(a,b)] -> Maybe b
lookup k [] = Nothing
......
......@@ -419,11 +419,10 @@ f =<< x = x >>= f
-- Evaluation and strictness ------------------------------------------------
seq :: a -> b -> b
seq x y = --case primForce x of () -> y
primSeq x y
seq x y = primSeq x y
($!) :: (a -> b) -> a -> b
f $! x = x `seq` f x
f $! x = x `primSeq` f x
-- Trivial type -------------------------------------------------------------
......@@ -1095,16 +1094,26 @@ null (_:_) = False
(x:xs) ++ ys = x : (xs ++ ys)
map :: (a -> b) -> [a] -> [b]
map f xs = [ f x | x <- xs ]
--map f xs = [ f x | x <- xs ]
map f [] = []
map f (x:xs) = f x : map f xs
filter :: (a -> Bool) -> [a] -> [a]
filter p xs = [ x | x <- xs, p x ]
--filter p xs = [ x | x <- xs, p x ]
filter p [] = []
filter p (x:xs) = if p x then x : filter p xs else filter p xs
concat :: [[a]] -> [a]
concat = foldr (++) []
--concat = foldr (++) []
concat [] = []
concat (xs:xss) = xs ++ concat xss
length :: [a] -> Int
length = foldl' (\n _ -> n + 1) 0
--length = foldl' (\n _ -> n + 1) 0
length [] = 0
length (x:xs) = let n = length xs in primSeq n (1+n)
(!!) :: [b] -> Int -> b
(x:_) !! 0 = x
......@@ -1220,19 +1229,34 @@ unwords [] = []
unwords ws = foldr1 (\w s -> w ++ ' ':s) ws
reverse :: [a] -> [a]
reverse = foldl (flip (:)) []
--reverse = foldl (flip (:)) []
reverse xs = ri [] xs
where ri acc [] = acc
ri acc (x:xs) = ri (x:acc) xs
and, or :: [Bool] -> Bool
and = foldr (&&) True
or = foldr (||) False
--and = foldr (&&) True
--or = foldr (||) False
and [] = True
and (x:xs) = if x then and xs else x
or [] = False
or (x:xs) = if x then x else or xs
any, all :: (a -> Bool) -> [a] -> Bool
any p = or . map p
all p = and . map p
--any p = or . map p
--all p = and . map p
any p [] = False
any p (x:xs) = if p x then True else any p xs
all p [] = True
all p (x:xs) = if p x then all p xs else False
elem, notElem :: Eq a => a -> [a] -> Bool
elem = any . (==)
notElem = all . (/=)
--elem = any . (==)
--notElem = all . (/=)
elem x [] = False
elem x (y:ys) = if x==y then True else elem x ys
notElem x [] = True
notElem x (y:ys) = if x==y then False else notElem x ys
lookup :: Eq a => a -> [(a,b)] -> Maybe b
lookup k [] = Nothing
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment