ผลข้างเคียงของ“ ผลที่สังเกตได้” หมายถึงอะไร?


11

ฉันมีคำถามเกี่ยวกับฟังก์ชั่นที่บริสุทธิ์ ตามหน้า Wikipedia หนึ่งในสิ่งที่จำเป็นสำหรับฟังก์ชั่น pure คือ:

การประเมินผลลัพธ์ไม่ได้ทำให้เกิดผลข้างเคียงหรือเอาท์พุทที่สังเกตเห็นได้ทางความหมายเช่นการกลายพันธุ์ของวัตถุที่ไม่แน่นอนหรือเอาท์พุทไปยังอุปกรณ์ I / O

ตอนนี้สิ่งนี้หมายความว่าอะไรจริงๆ หรือค่อนข้างฉันจะสร้างผลข้างเคียงที่ไม่สามารถสังเกตเห็นได้ทางความหมาย?


2
คุณไม่ควรใส่น้ำหนักที่มากเกินไปสำหรับสิ่งที่เขียนด้วยมือซึ่งครั้งหนึ่งสามารถพบได้ใน Wikipedia
Andrej Bauer

1
@AndrejBauer หือ? มือหยักเกี่ยวกับสิ่งนี้คืออะไร? ไม่ใช่ระดับการวิจัยบางที (ฉันไม่คิดว่าจะย้ายไปที่วิทยาการคอมพิวเตอร์ ) - แม้ว่าจะได้รับการตอบสนองของคุณอาจจะไม่
Gilles 'หยุดความชั่วร้าย'

ฉันคิดว่าฉันไม่ชอบคำว่า
Andrej Bauer

1
ให้ฉันใส่มันแตกต่างกัน: อะไรคือความแตกต่างระหว่าง "semantically observable" และ "observable" "Semantically" เป็นเพียงคำศัพท์ที่ไม่สมเหตุสมผล
Andrej Bauer

"semantic" ดูเหมือนจะมีความหมายพิเศษในด้านต่าง ๆ ของทฤษฎีการเขียนโปรแกรมอาจนำเข้าจากภาษาศาสตร์ / ปรัชญาซึ่งย้อนกลับไปหลายทศวรรษหรือที่รู้จักกันในชื่อ "syntax vs semantics" .... อาจเป็นคำถามอื่นที่นั่น ....
vzn

คำตอบ:


11

ซีแมนทิกส์ของโปรแกรมเป็นรูปแบบของพฤติกรรมซึ่งเหมือนกับโมเดลทางวิทยาศาสตร์ใด ๆ จะไม่สนใจลักษณะที่คุณไม่ต้องการศึกษา

แบบจำลองที่มีรายละเอียดสูงของการดำเนินการของโปรแกรมจะจำลองพฤติกรรมทางกายภาพของคอมพิวเตอร์ที่ดำเนินการดังกล่าวรวมถึงเวลาในการดำเนินการการใช้พลังงานการแผ่รังสีคลื่นแม่เหล็กไฟฟ้าและอื่น ๆ อย่างไรก็ตามบางครั้งพวกเขาก็ทำเรื่องสำคัญ: โมเดลที่มีประโยชน์ของเครื่องบินอัตโนมัติต้องมีข้อมูลรันไทม์, โมเดลที่มีประโยชน์ของความปลอดภัยของบัตรเครดิตต้องรวมถึงคลื่นแม่เหล็กไฟฟ้า, ...

ในความหมายทั่วไปผลข้างเคียงเช่นเวลาและการใช้พลังงานจะถูกละเว้น แม้ว่าในการตั้งค่าทางโลกที่คุณพิมพ์นิพจน์ที่ Haskell interpreter prompt การพิมพ์ผลลัพธ์เป็นผลข้างเคียง (หากคุณพยายามพิมพ์วัตถุที่ไม่มีที่สิ้นสุด หากล่าม Haskell มีหน่วยความจำไม่เพียงพอนี่เป็นผลข้างเคียงที่สังเกตเห็นได้ในแบบจำลอง "โลกแห่งความจริง" แต่ไม่ใช่ในรูปแบบอุดมคติของ Haskell ที่อนุญาตการคำนวณได้อย่างมีประสิทธิภาพ

สังเกตผลข้างเคียงที่เป็นหนึ่งซึ่งเป็นแบบจำลองในความหมาย ในภาษาทั่วไปของการเขียนโปรแกรมรูปแบบการใช้หน่วยความจำไม่ได้เป็นแบบจำลองดังนั้นการคำนวณที่ต้องใช้พื้นที่จัดเก็บ 1TB อาจเป็นจริงถึงแม้ว่าคุณพยายามเรียกใช้บนพีซีของคุณ

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

สำหรับตัวอย่างที่ละเอียดยิ่งขึ้นให้พิจารณาฟังก์ชันที่เขียนข้อมูลบางอย่างไปยังไฟล์ชั่วคราวและล้างข้อมูลหลังจากนั้น ในความหมายที่มีที่ว่างเพียงพอสำหรับไฟล์ชั่วคราวและโปรแกรมไม่แชร์ไฟล์ชั่วคราวฟังก์ชั่นจะไม่มีผลข้างเคียง ไฟล์ชั่วคราวทำหน้าที่เป็นหน่วยความจำเสริมที่ใช้โดยฟังก์ชั่น ในความหมายที่คำนึงถึงเงื่อนไขของระบบไฟล์ฟังก์ชั่นนี้มีผลข้างเคียง - มันอาจล้มเหลวเนื่องจากสถานการณ์ภายนอก ในซีแมนทิกส์ที่อนุญาตให้เครื่องพังฟังก์ชันจะมีผลข้างเคียง: หากเกิดข้อผิดพลาดระหว่างการทำงานของฟังก์ชันไฟล์ชั่วคราวอาจถูกทิ้งไว้ข้างหลัง ในความหมายที่อนุญาตให้โปรแกรมที่เรียกใช้งานพร้อมกันเพื่อดูและอาจแก้ไขไฟล์ชั่วคราวฟังก์ชันมีผลข้างเคียง

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