some work on avoiding partial functions
There are still hundreds of places that use partial functions head, tail, init, and last.
This commit is contained in:
parent
95e748cbd4
commit
28699c95a7
4 changed files with 45 additions and 14 deletions
24
Utility/BadPrelude.hs
Normal file
24
Utility/BadPrelude.hs
Normal file
|
@ -0,0 +1,24 @@
|
|||
{- Some stuff from Prelude should not be used, as it tends to be a source
|
||||
- of bugs.
|
||||
-
|
||||
- This exports functions that conflict with the prelude, which avoids
|
||||
- them being accidentially used.
|
||||
-}
|
||||
|
||||
module Utility.BadPrelude where
|
||||
|
||||
{- head is a partial function; head [] is an error -}
|
||||
head :: [a] -> a
|
||||
head = Prelude.head
|
||||
|
||||
{- tail is also partial -}
|
||||
tail :: [a] -> a
|
||||
tail = Prelude.tail
|
||||
|
||||
{- init too -}
|
||||
init :: [a] -> a
|
||||
init = Prelude.init
|
||||
|
||||
{- last too -}
|
||||
last :: [a] -> a
|
||||
last = Prelude.last
|
|
@ -27,6 +27,19 @@ readMaybe s = case reads s of
|
|||
((x,_):_) -> Just x
|
||||
_ -> Nothing
|
||||
|
||||
{- Like break, but the character matching the condition is not included
|
||||
- in the second result list.
|
||||
-
|
||||
- separate (== ':') "foo:bar" = ("foo", "bar")
|
||||
- separate (== ':') "foobar" = ("foo, "")
|
||||
-}
|
||||
separate :: (a -> Bool) -> [a] -> ([a], [a])
|
||||
separate c l = unbreak $ break c l
|
||||
where
|
||||
unbreak r@(a, b)
|
||||
| null b = r
|
||||
| otherwise = (a, tail b)
|
||||
|
||||
{- Catches IO errors and returns a Bool -}
|
||||
catchBoolIO :: IO Bool -> IO Bool
|
||||
catchBoolIO a = catchDefaultIO a False
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue