นี่คือ "การตีความ" ที่แนะนำของIO
monad หากคุณต้องการ "ตีความ" อย่างจริงจังคุณจำเป็นต้องใช้ "โลกแห่งความจริง" อย่างจริงจัง มันไม่เกี่ยวข้องว่าจะaction world
ได้รับการประเมินแบบพิเศษหรือไม่action
ไม่มีผลข้างเคียงใด ๆ ผลกระทบของมันจะถูกจัดการโดยการคืนสถานะใหม่ของเอกภพที่เกิดผลกระทบเหล่านั้นเช่นส่งแพ็กเก็ตเครือข่าย อย่างไรก็ตามผลของการทำงานเป็นและดังนั้นจึงรัฐใหม่ของจักรวาลอยู่((),world)
world
เราไม่ได้ใช้จักรวาลใหม่ที่เราอาจประเมินด้านเก็งกำไรด้านข้าง world
รัฐของจักรวาลอยู่
คุณอาจมีเวลายากที่จะจริงจัง มีหลายวิธีนี้เป็นสิ่งที่ดีที่สุดขัดแย้งเผินๆและไร้สาระ การเกิดขึ้นพร้อมกันโดยเฉพาะอย่างยิ่งไม่ชัดเจนหรือบ้ากับมุมมองนี้
"รอเดี๋ยวก่อน" คุณพูด " RealWorld
เป็นเพียง 'โทเค็น'. มันไม่จริงรัฐของจักรวาลทั้งหมด." โอเค "การตีความ" นี้ไม่ได้อธิบายอะไรเลย อย่างไรก็ตามในฐานะที่เป็นรายละเอียดการดำเนินการIO
นี้เป็นวิธีที่รุ่น GHC 1อย่างไรก็ตามนี่หมายความว่าเรามี "ฟังก์ชั่น" ที่น่าอัศจรรย์ซึ่งมีผลข้างเคียงและโมเดลนี้ไม่มีคำแนะนำเกี่ยวกับความหมายของมัน และเนื่องจากฟังก์ชั่นเหล่านี้มีผลข้างเคียงจริง ๆ ความกังวลของคุณเพิ่มขึ้นอย่างชัดเจน GHC จะต้องออกไปเพื่อให้แน่ใจRealWorld
และฟังก์ชั่นพิเศษเหล่านี้จะไม่ได้รับการปรับให้เหมาะสมในวิธีที่เปลี่ยนแปลงพฤติกรรมตามที่ตั้งใจไว้ของโปรแกรม
โดยส่วนตัว (ดังที่เห็นได้ชัดในตอนนี้) ฉันคิดว่ารูปแบบ "การผ่านโลก" ของIO
ไร้ประโยชน์และสับสนในฐานะเครื่องมือการสอน (ไม่ว่าจะมีประโยชน์สำหรับการนำไปใช้งานฉันไม่รู้สำหรับ GHC ฉันคิดว่ามันเป็นสิ่งประดิษฐ์ทางประวัติศาสตร์มากกว่า)
วิธีการทางเลือกหนึ่งคือดูIO
เป็นคำขออธิบายที่มีตัวจัดการการตอบกลับ มีหลายวิธีในการทำเช่นนี้ อาจเป็นไปได้มากที่สุดคือการใช้การก่อสร้าง monad ฟรีโดยเฉพาะเราสามารถใช้:
data IO a = Return a | Request OSRequest (OSResponse -> IO a)
มีหลายวิธีที่จะทำให้สิ่งนี้ซับซ้อนมากขึ้นและมีคุณสมบัติที่ค่อนข้างดีกว่า แต่นี่เป็นการปรับปรุง ไม่จำเป็นต้องมีสมมติฐานเชิงลึกเกี่ยวกับธรรมชาติของความเป็นจริงที่จะเข้าใจ สิ่งที่กล่าวมาทั้งหมดนั้นIO
เป็นเพียงโปรแกรมเล็ก ๆ น้อย ๆReturn
ที่ไม่ทำอะไรนอกจากคืนค่าหรือเป็นคำร้องขอไปยังระบบปฏิบัติการพร้อมตัวจัดการสำหรับการตอบสนอง OSRequest
สามารถเป็นสิ่งที่ชอบ:
data OSRequest = OpenFile FilePath | PutStr String | ...
ในทำนองเดียวกันOSResponse
อาจเป็นสิ่งที่ชอบ:
data OSResponse = Errno Int | OpenSucceeded Handle | ...
(หนึ่งในการปรับปรุงที่สามารถทำได้คือการทำให้สิ่งที่ปลอดภัยมากขึ้นเพื่อให้คุณรู้ว่าคุณจะไม่ได้รับOpenSucceeded
จากการPutStr
ร้องขอ) รุ่นนี้IO
เป็นการอธิบายคำขอที่ถูกตีความโดยบางระบบ (สำหรับ "จริง" IO
monad นี่คือ รันไทม์ของ Haskell เอง) จากนั้นบางทีระบบนั้นจะเรียกผู้จัดการที่เราให้มาพร้อมกับการตอบกลับ แน่นอนว่าสิ่งนี้ไม่ได้บ่งชี้ว่าPutStr "hello world"
ควรจัดการกับคำร้องขออย่างไร แต่ก็ไม่ได้แสร้งทำ มันทำให้ชัดเจนว่านี่คือการมอบหมายให้ระบบอื่น ๆ รุ่นนี้ก็ค่อนข้างแม่นยำ โปรแกรมผู้ใช้ทั้งหมดในระบบปฏิบัติการที่ทันสมัยต้องทำการร้องขอไปยังระบบปฏิบัติการเพื่อทำสิ่งใด
รุ่นนี้ให้สัญชาติญาณที่ถูกต้อง ตัวอย่างเช่นผู้เริ่มต้นจำนวนมากดูสิ่งต่าง ๆ เช่น<-
โอเปอเรเตอร์เป็น "คลาย" IO
หรือมีมุมมอง (เสริมโชคร้าย) ที่ว่าIO String
, พูด, เป็น "คอนเทนเนอร์" ที่ "มี" String
s (แล้ว<-
ดึงออก) มุมมองการตอบสนองคำขอนี้ทำให้มุมมองนี้ผิดอย่างชัดเจน OpenFile "foo" (\r -> ...)
ไม่มีในแฟ้มจับเป็น การเปรียบเทียบทั่วไปเพื่อเน้นสิ่งนี้คือไม่มีเค้กอยู่ภายในสูตรสำหรับเค้ก (หรืออาจเป็น "ใบแจ้งหนี้" จะดีกว่าในกรณีนี้)
รุ่นนี้ยังใช้งานได้พร้อมกับการทำงานพร้อมกัน เราสามารถมี Constructor for OSRequest
like ได้อย่างง่ายดายFork :: (OSResponse -> IO ()) -> OSRequest
และจากนั้นรันไทม์สามารถสอดแทรกคำร้องขอที่สร้างโดยตัวจัดการพิเศษนี้พร้อมตัวจัดการปกติ แต่ก็ชอบ ด้วยความเฉลียวฉลาดคุณสามารถใช้สิ่งนี้ (หรือเทคนิคที่เกี่ยวข้อง) เพื่อจำลองสิ่งต่าง ๆ เช่นการเกิดพร้อมกันโดยตรงแทนที่จะพูดว่า "เราขอให้ระบบปฏิบัติการและสิ่งต่าง ๆ เกิดขึ้น" นี่คือวิธีการทำงานของIOSpec
ห้องสมุด
1 Hugs ใช้การดำเนินการตามความต่อเนื่องIO
ซึ่งคล้ายกับสิ่งที่ฉันอธิบายถึงแม้ว่าด้วยฟังก์ชั่นทึบแสงแทนประเภทข้อมูลที่ชัดเจน นอกจากนี้ HBC ยังใช้การติดตั้งแบบต่อเนื่องตามชั้นบน IO ที่ใช้การตอบสนองการร้องขอกระแส NHC (และ YHC) ใช้ thunks นั่นคือคร่าวๆIO a = () -> a
แม้ว่าจะ()
ถูกเรียกWorld
แต่ก็ไม่ได้ผ่านการทำรัฐ JHC และ UHC นั้นใช้วิธีเดียวกันกับ GHC