Страницы

Поиск по вопросам

понедельник, 30 декабря 2019 г.

Поэлементный вывод списка на экран

#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

Комментариев нет:

Отправить комментарий