Haskell:
Odczytywanie pliku tekstowego
How to:
Czytanie pliku tekstowego w Haskellu jest proste. Użyjemy funkcji readFile
, którą dostarcza standardowa biblioteka.
main :: IO ()
main = do
content <- readFile "example.txt"
putStrLn content
Jeśli plik “example.txt” zawiera tekst “Cześć, Haskell!”, wyjście będzie wyglądać tak:
Cześć, Haskell!
A co jeśli chcesz pracować z każdą linijką osobno? Użyj lines
:
main :: IO ()
main = do
content <- readFile "example.txt"
let linesOfContent = lines content
mapM_ putStrLn linesOfContent
Jeżeli “example.txt” ma wiele linii, każda z nich zostanie wypisana osobno.
Deep Dive
Funkcja readFile
pojawiła się w Haskellu 98 i od tamtej pory jest standardowym sposobem na odczytywanie plików tekstowych. Jest prosta, ale ma swoje ograniczenia, na przykład nie radzi sobie z dużymi plikami – lepiej wtedy użyć hGetContents
i obsługi strumieni.
readFile
korzysta z leniwej ewaluacji, co oznacza że zawartość pliku jest wczytywana tylko wtedy, gdy jest potrzebna. Dzięki temu małe pliki są szybko przetwarzane, ale przy dużych plikach to może prowadzić do problemów z wydajnością.
Alternatywą dla readFile
jest readFile'
z biblioteki strict
, która wczytuje cały plik naraz – dobre rozwiązanie dla dużych plików.
A kwestia bezpieczeństwa? Funkcje takie jak withFile
automatycznie zamykają plik po zakończeniu pracy, której zakres określamy. Przykład:
import System.IO
main :: IO ()
main = withFile "example.txt" ReadMode (\handle -> do
content <- hGetContents handle
putStr content)
Bezpieczniej, bo nie musimy pamiętać o zamykaniu pliku.
See Also
- Haskell 2010 Language Report: https://www.haskell.org/onlinereport/haskell2010/
- Hackage, biblioteka pakietów Haskell: https://hackage.haskell.org/
- Learn You a Haskell for Great Good!, przystępny tutorial dla Haskell: http://learnyouahaskell.com/chapters
- Real World Haskell, książka do praktycznej nauki Haskell: http://book.realworldhaskell.org/
- “Haskell Programming from first principles” – kompleksowe wprowadzenie do języka: http://haskellbook.com/