一、易改进:
goOverList' :: [String] -> IO ()
goOverList' [] = return ()
goOverList' (x:xs) = do
putStrLn x
goOverList' xs
递归的基本情况应该是空列表:在这种情况下,您只需返回return ()不执行任何操作的 IO 操作。当你有一个或多个元素时,你打印它并继续列表的其余部分,就这么简单。
同样的事情可以通过更紧凑的定义来实现mapM_ :: Monad m => (a -> m b) -> [a] -> m ():它与常规相同map,除了它适用于单子动作。m [b]它不会像常规那样返回结果集合mapM,而是将其丢弃。在这种情况下,它对您来说很好,因为您只对打印出他列表中的元素感兴趣。
goOverList'' :: [String] -> IO ()
goOverList'' = mapM_ putStrLn
为了更通用,我们可以在输入中依赖print :: Show a => a -> IO ()而不是putStrLn接受每个“可显示”项目列表:
goOverList''' :: (Show a) => [a] -> IO ()
goOverList''' = mapM_ print
data T = One | Two | Three deriving (Show)
main = do
let myList = [One, Two, Three]
goOverList''' myList