"ปกติ" วิธีการใช้ถ้อยคำสิ่งที่ฟังก์ชั่นที่บริสุทธิ์คือเป็นในแง่ของความโปร่งใสอ้างอิง ฟังก์ชั่นคือบริสุทธิ์ถ้ามันเป็นความโปร่งใส referentially
Referential Transparencyโดยประมาณหมายความว่าคุณสามารถแทนที่การเรียกไปยังฟังก์ชันด้วยค่าส่งกลับหรือในทางกลับกัน ณ จุดใดก็ได้ในโปรแกรมโดยไม่ต้องเปลี่ยนความหมายของโปรแกรม
ตัวอย่างเช่นหาก C printf
มีความโปร่งใสอ้างอิงทั้งสองโปรแกรมควรมีความหมายเหมือนกัน:
printf("Hello");
และ
5;
และโปรแกรมทั้งหมดต่อไปนี้ควรมีความหมายเหมือนกัน:
5 + 5;
printf("Hello") + 5;
printf("Hello") + printf("Hello");
เนื่องจากprintf
ส่งคืนจำนวนอักขระที่เขียนในกรณีนี้ 5.
จะชัดเจนยิ่งขึ้นด้วยvoid
ฟังก์ชันต่างๆ ถ้าฉันมีฟังก์ชั่นvoid foo
แล้ว
foo(bar, baz, quux);
ควรจะเหมือนกับ
;
กล่าวคือเนื่องจากfoo
ไม่ส่งคืนอะไรเลยฉันควรจะสามารถแทนที่ได้โดยไม่ต้องเปลี่ยนความหมายของโปรแกรม
เป็นที่ชัดเจนแล้วว่าค่าprintf
มิได้foo
มีความโปร่งใส referentially และทำให้ค่าของพวกเขาบริสุทธิ์ ในความเป็นจริงvoid
ฟังก์ชันไม่สามารถอ้างอิงได้อย่างโปร่งใสเว้นแต่จะเป็นแบบไม่ใช้งาน
ฉันพบว่าคำจำกัดความนี้จัดการได้ง่ายกว่าที่คุณให้มา นอกจากนี้ยังช่วยให้คุณสามารถนำไปใช้ในทุกรายละเอียดที่คุณต้องการ: คุณสามารถนำไปใช้กับแต่ละนิพจน์ฟังก์ชันและโปรแกรมทั้งหมดได้ ตัวอย่างเช่นช่วยให้คุณสามารถพูดคุยเกี่ยวกับฟังก์ชันเช่นนี้ได้:
func fib(n):
return memo[n] if memo.has_key?(n)
return 1 if n <= 1
return memo[n] = fib(n-1) + fib(n-2)
เราสามารถวิเคราะห์นิพจน์ที่ประกอบกันเป็นฟังก์ชันและสรุปได้อย่างง่ายดายว่านิพจน์ไม่โปร่งใสและไม่บริสุทธิ์เนื่องจากใช้โครงสร้างข้อมูลที่ไม่แน่นอนคือmemo
อาร์เรย์ อย่างไรก็ตามเราสามารถดูฟังก์ชั่นดังกล่าวและสามารถเห็นได้ว่ามีความโปร่งใสโดยอ้างอิงและบริสุทธิ์ บางครั้งเรียกว่าความบริสุทธิ์ภายนอกกล่าวคือฟังก์ชันที่ปรากฏต่อโลกภายนอกอย่างบริสุทธิ์ แต่ถูกนำไปใช้ภายในที่ไม่บริสุทธิ์
ฟังก์ชั่นดังกล่าวยังคงมีประโยชน์เนื่องจากในขณะที่สิ่งเจือปนเข้าไปทำลายทุกสิ่งรอบตัวอินเทอร์เฟซบริสุทธิ์ภายนอกจะสร้าง "กำแพงกั้นความบริสุทธิ์" ชนิดหนึ่งซึ่งสิ่งเจือปนจะติดเชื้อเพียงสามบรรทัดของฟังก์ชัน แต่จะไม่รั่วไหลออกไปสู่ส่วนที่เหลือของโปรแกรม . ทั้งสามบรรทัดนี้วิเคราะห์ความถูกต้องได้ง่ายกว่าทั้งโปรแกรม