คำวิจารณ์ของ IO monad ที่ถูกมองว่าเป็น monad state ที่ปฏิบัติงานบนโลกนี้


46

IOmonad ใน Haskell มักจะมีการอธิบายเป็น monad รัฐที่รัฐเป็นโลก ดังนั้นค่าของชนิดIO amonad worldState -> (a, worldState)ถูกมองว่าเป็นสิ่งที่ชอบ

ก่อนหน้านี้ฉันอ่านบทความ (หรือโพสต์รายการบล็อก / จดหมายข่าว) ที่วิจารณ์มุมมองนี้และให้เหตุผลหลายประการว่าทำไมมันไม่ถูกต้อง แต่ฉันจำไม่ได้ว่าทั้งบทความและเหตุผล มีใครรู้บ้าง

แก้ไข:บทความดูเหมือนจะหายไปดังนั้นเริ่มรวบรวมข้อโต้แย้งต่าง ๆ ที่นี่ ฉันเริ่มที่จะทำให้สิ่งต่าง ๆ น่าสนใจยิ่งขึ้น

แก้ไข:บทความที่ฉันกำลังมองหาคือการจัดการกับทีมที่น่าอึดอัดใจ: อินพุต / เอาท์พุต monadic, การทำงานพร้อมกัน, ข้อยกเว้นและการโทรภาษาต่างประเทศใน Haskellโดย Simon Peyton Jones (ขอบคุณคำตอบของ TacTics)



@JoachimSauer ขอบคุณมันเป็นบทความที่น่าสนใจ แต่ไม่ใช่สิ่งที่ฉันกำลังมองหา สิ่งนั้นได้มุ่งเน้นไปที่กระบวนทัศน์ที่ล้ำสมัย
Petr Pudlák

ความเห็นที่นี่เป็นการเริ่มต้นที่ดี
อดัม

1
"โลก" หมายถึงอะไรในบริบทนี้ ฉันคิดว่ามันไม่ได้หมายความว่า "โลก" มันเป็นขอบเขตระดับโลกบางอย่าง? ผู้เขียนที่เขียนสิ่งนี้ขายตัวเองสั้น ๆ หากเขาต้องการสับสนและบดขยี้อัตตาของผู้อ่านเขาควรเรียกมันว่า "รัฐคือจักรวาล" หรือ "รัฐแห่งพระเจ้า" โลก. ป่า! คนหนุ่มสาวที่คุณปรารถนาสูงไม่พอในวันนี้!
GlenPeterson

คำตอบ:


33

ปัญหาIO a = worldState -> (a, worldState)คือว่าถ้านี่เป็นเรื่องจริงเราสามารถพิสูจน์ได้forever (putStrLn "Hello") :: IO aและundefined :: IO aมีความเท่าเทียมกัน นี่คือหลักฐานการได้รับความเห็นชอบจาก dolio (2010, irc):

forever m
 =
m >> forever m
 =
fix (\r -> m >> r)
 = {definition of >> for worldState -> (a, worldState)}
fix (\r -> \w -> r (snd $ m w))

แทรก: (\r w -> r (snd $ m w)) ⊥ = ⊥

(\r w -> r (snd $ m w)) ⊥
  =
\w -> ⊥ (snd $ m w))
  =
⊥ . snd . m
  =
⊥

ดังนั้น forever m = fix (\r -> \w -> r (snd $ m w)) = ⊥

โดยเฉพาะอย่างยิ่งforever (putStrLn "Hello") = ⊥และด้วยเหตุนี้forever (putStrLn "Hello")และundefinedเป็นโปรแกรมที่เทียบเท่า อย่างไรก็ตามชัดเจนว่าพวกเขาไม่ควรได้รับการพิจารณาให้เทียบเท่าโปรแกรมในทางทฤษฎีหรือในทางปฏิบัติ

ขอให้สังเกตว่ารุ่นนี้ผิดแม้ว่าจะไม่เรียกใช้พร้อมกัน


7
มีใครประหลาดใจบ้างที่โปรแกรมการขุดรากถอนโคนจะเทียบเท่ากับundefinedในอรรถศาสตร์บริสุทธิ์ของ Haskell? ⊥sที่แตกต่างกันควรจะแยกไม่ออกในความหมายอันบริสุทธิ์ของ Haskell! แต่เมื่อเราคิดว่าการดำเนินการเกี่ยวกับโปรแกรมของเราเราต้องการแยกแยะความแตกต่างของ⊥ด้วยแม้ว่าIOจะไม่เกี่ยวข้อง ฉันสนใจว่าโปรแกรมของฉันกำลังส่งข้อยกเว้นหรือเข้าสู่วงวนไม่สิ้นสุดแม้ว่าคุณจะสามารถพิสูจน์ได้ว่ารายการเหล่านั้นเท่ากันโดยการพิสูจน์ว่าพวกเขาทั้งคู่⊥ นั่นไม่ใช่ความขัดแย้งจริง ๆ
Ben

3
denotations ของ⊥และ [0,1 .. ] มีความชัดเจนแม้ว่าพวกเขาจะเป็นทั้ง "ไม่สิ้นสุด" ความแตกต่างคือ⊥หมายถึงการคำนวณที่ไม่สิ้นสุดและไม่ก่อผลในขณะที่ [0,1 .. ] นั้นไม่สิ้นสุด แต่มีประสิทธิผล เราคาดหวัง (ตลอดไป (putStrLn "Hello")) เพื่อให้มีการบอกเลิกที่ไม่สิ้นสุด แต่มีประสิทธิผลเหมือนกัน
Russell O'Connor

1
แต่forever (putStrLn "Hello")ไม่เหมือน[0,1..]แน่นอน หลักฐานของคุณไม่เฉพาะเจาะจงworldStateดังนั้นจึงใช้กับ monad รัฐทั่วไป ดังนั้นforever (someModificationWith "Hello")ก็นับว่าเทียบเท่ากับ ot ฉันไม่แปลกใจเลยกับผลลัพธ์นั้น มันไม่ได้ผลในความหมายเชิง Denotational และสิ่งที่คอมพิวเตอร์กำลังทำงานในขณะที่เรารอตลอดไปนั้นไม่เกี่ยวข้อง สิ่งเดียวกันสำหรับforever (putStrLn "Hello"); มันไม่ควรและไม่ควรสร้างสภาวะโลกใหม่ที่เราสามารถกินได้อย่างเกียจคร้าน
เบ็น

ภาษาการเขียนโปรแกรมเช่น Mercury and Clean นั้นใช้การส่งผ่านของรัฐโลกอย่างชัดเจนเพื่อให้แบบจำลองการประกาศสำหรับ IO ผิดหรือเปล่า?
เบ็น

@Ben คุณหมายถึงว่าโลกผ่านการทำงานพร้อมกันได้อย่างไร? คุณเคยเห็นรหัส Rosetta สำหรับการทำงานพร้อมกันของ Mercury หรือไม่? ฉันสงสัยว่าสิ่งใดมีความหมายเช่นกัน
CMCDragonkai

12

นี่คือคำตอบเล็กน้อย: การเปลี่ยนแปลงใด ๆ ที่เกิดขึ้นกับสถานะของ Monad นั้นเกิดจากการกระทำใด ๆ ที่เกิดขึ้นใน Monad หากคำอธิบาย“ WorldState -> (a, WorldState)” อ้างสิทธิ์ในทรัพย์สินเดียวกันโดย WorldState เป็นค่าที่แท้จริงซึ่งมีเพียงการเปลี่ยนแปลงของ IO monad เท่านั้นมันผิด การเปลี่ยนแปลงเวลาเนื้อหาของไฟล์สถานะของการจัดการ ฯลฯ สามารถเปลี่ยนแปลงได้อย่างอิสระจากสิ่งที่เกิดขึ้นใน IO monad นั่นคือจุดสำคัญของ IO monad ความจริงที่ว่า GHC ส่งผ่านค่า RealWorld (หรือ w / e เดิม) ด้านล่างคือการรับประกันสิ่งต่าง ๆ ตามลำดับเท่าที่ฉันรู้หากเป็นเช่นนั้น (อาจเป็นเพียงสิ่งที่จะใส่ค่า ST)


8
ที่จริงไม่ใช่ปัญหา คุณสามารถสร้างแบบจำลองการดำเนินการเชื่อมโยงเป็นการดำเนินการแก้ไขสถานะโลกที่ได้รับจากที่เก็บกฎบางอย่างที่คงที่ แต่ไม่รู้
sclv

1
@sclv: ใช่ แต่ที่เก็บกฎคงที่ แต่ไม่สามารถอธิบายได้นี้เป็นปัจจัยที่ทำให้เกิดความแตกต่างที่ทำให้ IO ไม่ใช่ monad ของรัฐความไม่สอดคล้องนี้ไม่พบใน monad ของรัฐ
Jimmy Hoffa

ข้อโต้แย้งที่ฉันได้ยินเกี่ยวกับสถานะ WorldState นั้นเกี่ยวข้องกับการเกิดพร้อมกันแม้ว่าฉันจะไม่สามารถจำข้อโต้แย้งที่แน่นอนได้ แต่ถึงกระนั้นฉันก็ตั้งสมมติฐานว่า WorldState สามารถเข้ารหัสอนาคตด้วยเช่นกันดังนั้นฉันจึงยังไม่เห็นปัญหาจริงๆ แน่นอนฉันคิดว่าฉันขาดอะไรไป
Thomas Eding

@JimmyHoffa: คุณสามารถพกพาที่เก็บกฎในสถานะแม้ว่า
sclv

1
@JimmyHoffa: นี่คือจุดประสงค์ของการเป็นนามธรรม นอกจากนี้หากต้องการติดตามความคิดเห็นเริ่มต้นของฉันให้ล้างโมเดลของ IO ว่าผ่านไปทั่วโลกอย่างชัดเจนและมีความสุขโดยใช้ประเภทที่ไม่ซ้ำกันเพื่อให้แน่ใจว่าคุณจะไม่โกงและ "สร้าง" โลก นี่เป็นวิธีหนึ่งในการบังคับใช้สิ่งที่เป็นนามธรรม
sclv

12

ฉันเขียนบล็อกโพสต์ในหัวข้อวิธีการสร้างแบบจำลอง IO เป็นรูปแบบของ coroutine แบบอสมมาตรที่สื่อสารกับระบบรันไทม์สำหรับภาษาของคุณ (เป็นที่ยอมรับในส่วนที่สามของซีรีส์)

http://comonad.com/reader/2011/free-monads-for-less-3/

โพสต์นั้นครอบคลุมถึงสาเหตุที่ทำให้รู้สึกไม่สะดวกที่จะให้เหตุผลเกี่ยวกับความหมายของ 'การผ่านโลก'


+1 - น่าสนใจเป็นพิเศษเนื่องจากฉันวางแผนที่จะใช้งาน IO ของภาษาที่ฉันออกแบบมาในลักษณะที่คล้ายคลึงกับสิ่งนี้! :)
Jules

8

ดูการแก้ปัญหาที่น่าอึดอัดใจทีม

เหตุผลสำคัญคือโมเดล RealWorld state ของ IO monad นั้นใช้งานไม่ได้กับการทำงานพร้อมกัน SPJ ในความโปรดปรานแบบคลาสสิกที่สามารถอ่านได้นี้โดยใช้ความหมายในการปฏิบัติการเพื่อทำความเข้าใจ


ฉันเชื่อว่านี่เป็นบทความต้นฉบับที่ฉันค้นหาส่วนใหญ่เป็น 3.1 หากคุณโพสต์ไว้ก่อนที่ฉันจะแก้ไขคำถามฉันจะยอมรับคำตอบของคุณแล้ว แต่ตอนนี้ฉันคิดว่ามันจะยุติธรรมกว่าที่จะรอจนถึงจุดสิ้นสุดเพื่อดูแนวคิดทั้งหมดที่คนอื่นจะโพสต์
Petr Pudlák

5

ข้อร้องเรียนหลักเกี่ยวกับโมเดลรัฐ RealWorld คือตามที่ TacTics กล่าวว่าการส่งผ่านทั่วโลกไม่จำเป็นต้องทำงานพร้อมกัน แต่ Wouter Swierstra และ Thorsten Altenkirch แสดงให้เห็นว่าเหตุผลเกี่ยวกับการเห็นพ้องว่า "โลกผ่าน" ผลที่มีลำดับคงที่ แต่-โดยพลการของ interleaving กระทู้ในกระดาษของพวกเขา "ความงามในสัตว์: การ Sematics ฟังก์ชั่นสำหรับอึดอัด Squad": http : //www.staff.science.uu.nl/~swier004/Publications/BeautyInTheBeast.pdf

รหัสที่สอดคล้องกับสิ่งนี้คือการแฮ็กเป็น IOSpec: http://hackage.haskell.org/package/IOSpec

ฉันคิดว่าวิทยานิพนธ์ของ Wouter มีรายละเอียดเพิ่มเติมที่: http://www.staff.science.uu.nl/~swier004/Publications/Thesis.pdf

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.