IO

โปรแกรม F# นี้จะแสดงคำว่า What is your name? รออินพุต แล้วแสดงคำว่า Hello ตามด้วยค่าที่ผู้ใช้กรอก

open System
Console.WriteLine "What is your name?"
Console.WriteLine ("Hello " + Console.ReadLine())

เมื่อแปลงเป็น Haskell จะได้โค้ดดังนี้

main = do
putStrLn "What is your name?"
putStrLn ("Hello " ++ getLine)

แต่โค้ดนี้จะคอมไพล์ไม่ผ่าน

เนื่องจาก Haskell ไม่อนุญาต ให้ “Hello “ ซึ่งมี type เป็น String ต่อกับ IO(String) ที่ได้จาก getLine โดยตรง จะต้องดึง String ออกจาก IO ที่ครอบมันไว้เสียก่อน

สามารถดึง String ออกจาก IO ด้วยโอเปอเรเตอร์ bind (>≥)

main = 
putStrLn "What is your name?" >>
getLine >>= \n -> putStrLn ("Hello " ++ n)

หรือใช้ do notation

main = do
putStrLn "What is your name?"
name <- getLine
putStrLn ("Hello " ++ name)

ใน Haskell ฟังก์ชั่นทุกฟังก์ชั่นต้องเป็น purely function เราไม่สามารถเขียนคำสั่งที่มี side effect เช่น การอ่าน/เขียนไฟล์ หรือรับอินพุตจากผู้ใช้ภายในฟังก์ชั่นรวมกับ expression อื่นได้โดยตรง

IO จึงทำหน้าที่เป็น context ที่ encode ข้อมูลที่มี interactive กับโลกภายนอก ซึ่งต้องใช้โอเปอเรเตอร์พิเศษเช่น bind หรือ do notation ในการ decode ข้อมูลออกมา ค่าที่ได้จะสามารถใช้ร่วมกับ expression อื่น ๆ ในโปรแกรม และ expression ใหม่ที่ได้ก็ยังคงคุณสมบัติ referentially transparent

Like what you read? Give wk a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.