#haskell
Хотелось бы понять, можно ли в Haskell каким-то образом вывести список на экран поэлементно, то бишь аналог такого кода на Java for(String s: string_array){ System.out.println(s); } Почитал книжки - нашел следующее решение: printList list = case list of [] -> putStrLn "" (x:xs) -> do putStrLn $ show x printList xs
Ответы
Ответ 1
Поэтапное улучшение ("ухаскеление") решения: 0. Добавляется сигнатура printList :: [String] -> IO () printList list = case list of [] -> putStrLn "" (x:xs) -> do putStrLn $ show x printList xs 1. Исчезает case: printList :: [String] -> IO () printList [] = putStrLn "" printList (x:xs) = do putStrLn $ show x printList xs 2. Исчезает do: printList :: [String] -> IO () printList [] = putStrLn "" printList (x:xs) = (putStrLn $ show x) >> printList xs 3. Исчезает явная рекурсия (правда, пустая строка в конце тоже исчезает): printList :: [String] -> IO () printList = mapM_ $ putStrLn . show 4. Обобщение со строк на любые объекты, к которым можно применить show: printList :: Show a => [a] -> IO () printList = mapM_ $ putStrLn . show 5. Выражение putStrLn . show эквивалентно функции print printList :: Show a => [a] -> IO () printList = mapM_ print Если кому-нибудь интересно, могу разбить пункт "3." на более мелкие шаги.Ответ 2
Можно ещё вот так, если у вас список строк printList::[String]->IO () printList = putStrLn.unlines или вот так для произвольного типа реализующего Show printList::Show a => [a] -> IO () printList = putStrLn.unlines.map showОтвет 3
Буквальный перевод приведённого ява-кода, два варианта: mapM_ print [1,2,3,4] forM_ [1,2,3,4] print
Комментариев нет:
Отправить комментарий