Haskell:
การอ่านไฟล์ข้อความ
วิธีการ:
นี่คือวิธีที่คุณสามารถทำให้ Haskell อ่านไฟล์ข้อความโดยไม่ต้องเหงื่อตก เปิดตัวแก้ไขที่คุณชื่นชอบ และมาเขียนโค้ดกัน
import System.IO
main = do
-- เปิดไฟล์ในโหมดอ่าน
handle <- openFile "hello.txt" ReadMode
-- อ่านเนื้อหาของไฟล์
ประกาศ <-hGetContents handle
-- พิมพ์เนื้อหาของไฟล์ออกมา
putStrLn content
-- อย่าลืมปิดไฮด์เดลไฟล์!
hClose handle
รันโค้ดนี้ และถ้าคุณมีไฟล์ “hello.txt” ที่มีเนื้อหา “Hello, World!” ข้างใน, คุณจะได้รับ:
Hello, World!
นี่คือวิธีที่สั้นกว่า ราบรื่นกว่า ทำเช่นเดียวกันด้วยความยุ่งยากน้อยลง:
-- ฟังก์ชัน 'readFile' ทำหน้าที่เปิดและอ่านในครั้งเดียว
main = do
content <- readFile "hello.txt"
putStrLn content
ผลลัพธ์ก็ยังคือ,
Hello, World!
ศึกษาลึกลงไป
นานมาแล้ว โปรแกรมเป็นสิ่งมีชีวิตที่ไม่สังคม มักจะประมวลผลข้อมูลที่มันสร้างขึ้นเอง แต่ความซับซ้อนเพิ่มขึ้น และความต้องการในการดึงข้อมูลจากภายนอกก็เพิ่มขึ้นเช่นกัน ดังนั้นการอ่านจากไฟล์จึงกลายเป็นสิ่งที่จำเป็น
Haskell ให้วิธีต่างๆ ในการอ่านไฟล์ เราสามารถทำได้ด้วยวิธีระดับต่ำด้วย openFile
, hGetContents
, และ hClose
หรือใช้วิธีสบายๆ ด้วย readFile
, ซึ่งจัดการทุกอย่างอย่างเป็นระเบียบ
readFile
เป็นการอ่านแบบล่าช้า – มันอ่านเนื้อหาตามที่ต้องการ, ซึ่งมีประสิทธิภาพด้านหน่วยความจำสำหรับไฟล์ขนาดใหญ่ แต่อาจสร้างความประหลาดใจได้ถ้าไฟล์เปลี่ยนแปลงในระหว่างนั้น กระบวนการระดับต่ำให้การควบคุมมากขึ้น ทำให้มันมีความคาดเดาได้มากขึ้น แต่ยังมีความล่าอย่างมาก สำหรับข้อความขนาดมหึมา, Haskell มี hGetLine
หรือไลบรารีอย่าง conduit
และ pipes
ช่วยจัดการหน่วยความจำและการประมวลผลอย่างละเอียดขึ้น
การดำเนินการ IO
มาตรฐานของ Haskell จัดการกับไฟล์โดยใช้กลไกของระบบปฏิบัติการระดับพื้นฐาน ไลบรารีต่างๆ ทำการสรุปเหล่านี้เป็นการดำเนินการที่ง่ายต่อผู้ใช้มากขึ้น แต่ในที่สุด พวกเขาก็สร้างขึ้นบน IO
monad ของ Haskell, ซึ่งรับรองว่าการดำเนินการเกิดขึ้นในลำดับที่ถูกต้อง
ดูเพิ่มเติม
- สำหรับเอกสารการใช้งาน Haskell อย่างเป็นทางการ, โปรดตรวจสอบ เอกสารการใช้งานข้อมูลอินพุตและเอาต์พุตของ Haskell.
- ถ้าคุณกระหายความรู้เพิ่มเติม, ลองดูที่ Learn You a Haskell for Great Good!.
- ศึกษาเรื่องการจัดการไฟล์ลึกซึ้งกับ Real World Haskell’s take on IO.
- สำรวจไลบรารีสตรีมมิ่งสำหรับไฟล์ขนาดใหญ่ด้วย conduit และ pipes.