เพื่อให้คำตอบของ Sibi สมบูรณ์ >>
สามารถดูได้ว่าเป็น ;
ในภาษาอื่นเช่น C หรือ C++..
เมื่อคุณทำในภาษา C (หรือเทียบเท่าในภาษาอื่น)
printf("ฟู"); printf("บาร์");
เห็นได้ชัดว่าคุณพิมพ์ foobar
(ผลข้างเคียง) แต่การเรียก printf
เหล่านั้นก็มีค่าตอบแทนเช่นกัน ซึ่งในกรณีของเราคือความยาวที่กำลังพิมพ์ เช่น 3 3 คุณเคยสงสัยหรือไม่ว่าเกิดอะไรขึ้นกับตัวเลขเหล่านั้น พวกเขาถูกทิ้งไป เพราะใน C, expr 1; ประสบการณ์ 2 หมายถึง
- ประเมิน expr1
- ทิ้งผลลัพธ์ของมันไป
- ประเมิน expr2
(ณ จุดนั้น คุณอาจถามตัวเองว่าทำไมคอมไพเลอร์ถึงต้องกังวลกับการประเมิน expr1 ถ้ามันต้องทิ้งผลลัพธ์ของมันไป ? เนื่องจากผลข้างเคียง ในกรณีของ printf
ผลข้างเคียงคือการพิมพ์อะไรบางอย่าง คุณ ไม่ค่อยสนใจค่าที่ส่งคืนเอง)
ดังนั้น ;
จึงถูกมองว่าเป็นตัวดำเนินการที่ใช้ 2 นิพจน์และส่งคืนนิพจน์ใหม่ นี่เหมือนกับสิ่งที่ตัวดำเนินการ >>
ทำทุกประการ
เมื่อคุณเขียน
print "foo" >> print "bar"
มันเทียบเท่ากับ printf("foo");printf("bar")
ทุกประการ ยกเว้น (และนั่นคือความแตกต่างที่สำคัญ) >>
ไม่ใช่สิ่งมหัศจรรย์เช่น ;
ใน C >>
เป็นตัวดำเนินการที่ผู้ใช้กำหนดและสามารถกำหนดใหม่สำหรับ Monad แต่ละประเภทได้ นี่คือเหตุผลที่โปรแกรมเมอร์ Haskell รัก Monad มาก กล่าวโดยสรุป มันช่วยให้คุณกำหนดพฤติกรรม ;
ของคุณเองใหม่ได้
ดังที่เราเห็น ใน C ;
เพียงแค่ประเมินนิพจน์และละทิ้งค่าของมันไป อันที่จริง มันซับซ้อนกว่าเล็กน้อยเพราะไม่ใช่ break
หรือ return
ไม่มีสิ่งใดในโมนาดเมย์ที่สามารถเห็นได้ว่าเป็น break
หรือ return
>>
ประเมินนิพจน์แรก และหยุดหากเป็น Nothing
มิฉะนั้นจะละทิ้งคุณค่าและดำเนินต่อไป
ตัวอย่างแรกของคุณสามารถพบได้ใน C
(ฉันคิดว่ามันถูกต้อง C)
3; return
และ
return; 3
ตัวอย่างแรก คำนวณ 3
ละทิ้งค่าและส่งกลับ ประการที่สองกลับมาทันที
เพื่อตอบคำถามของคุณ when is it usefull
? เกือบตลอดเวลาที่คุณใช้ IO แม้ว่าคุณจะไม่ค่อยเห็นมันก็ตาม
แทนที่จะเขียน
print "foo" >> print "bar"
Haskell จัดเตรียมน้ำตาลวากยสัมพันธ์ซึ่งจะแปลงบรรทัดใหม่ (ค่อนข้างมาก) เป็น >>
ผ่านทาง do-notation ดังนั้นคุณจะเขียน
do
print "foo"
print "bar"
ซึ่งเทียบเท่ากับเวอร์ชันก่อนหน้าอย่างเคร่งครัด (ความจริงแล้วเวอร์ชันสัญลักษณ์ doation จะถูกแปลงเป็นเวอร์ชันก่อนหน้าโดยคอมไพเลอร์)
มันยังเทียบเท่ากับ (แม้ว่าจะไม่ค่อยได้ใช้ก็ตาม)
do print "foo"; print "bar"
โดยสรุป >>
สามารถมองได้ว่าเทียบเท่ากับ ;
หรือการขึ้นบรรทัดใหม่เป็นภาษาอื่นที่มีความแตกต่างว่าความหมายที่แน่นอนนั้นขึ้นอยู่กับบริบท (ที่ Monad กำลังดำเนินการอยู่) >>
ในบางที monad แตกต่างจาก >>
ใน IO Monad
person
mb14
schedule
20.07.2014