RWH 第四章

-- 自己写一些安全的列表函数,确保它们不会出错。
safeHead :: [a] -> Maybe a
safeHead [] = Nothing
safeHead xs = Just $ head xs

safeTail :: [a] -> Maybe [a]
safeTail [] = Nothing
safeTail xs = Just $ tail xs

safeLast :: [a] -> Maybe a
safeLast [] = Nothing
safeLast xs = Just $ last xs

safeInit :: [a] -> Maybe [a]
safeInit [] = Nothing
safeInit xs = Just $ init xs


map' :: (a -> b) -> [a] -> [b]
map' f (x: xs) = f x : map f xs
map' _ [] = []


asInt_fold :: [Char] -> Int
asInt_fold xs = foldl step 0 xs
    where step x y = x * 10  + (digitToInt y)

-- Prelude下面的函数 concat 将一个列表的列表连接成一个单独的列表
concat' :: [[a]] -> [a]
concat' = foldr step [] 
    where step x y = x ++ y

-- 写出你自己山寨的 takeWhile 函数,首先用显式递归的手法,然后改成 foldr 形式.
takeWhile' :: (a -> Bool) -> [a] -> [a]
takeWhile' f (x: xs)
    | f x = x: takeWhile' f xs
    | otherwise = []

takeWhile'' :: (a -> Bool) -> [a] -> [a]
takeWhile'' f = foldr step []
    where step x y
        | f x = x: y
        | otherwise = []
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容