ฟังก์ชั่นการเขียนโปรแกรมรวมถึงเทคนิคที่แตกต่างกัน เทคนิคบางอย่างใช้ได้ผลข้างเคียง แต่สิ่งหนึ่งที่สำคัญคือการให้เหตุผลที่เท่าเทียมกัน: ถ้าฉันเรียกใช้ฟังก์ชันบนค่าเดียวกันฉันจะได้ผลลัพธ์เหมือนกันเสมอ ดังนั้นฉันสามารถทดแทนการเรียกใช้ฟังก์ชันด้วยค่าที่ส่งคืนและรับลักษณะการทำงานที่เทียบเท่า สิ่งนี้ทำให้ง่ายต่อการใช้เหตุผลเกี่ยวกับโปรแกรมโดยเฉพาะเมื่อทำการดีบั๊ก
หากฟังก์ชันมีผลข้างเคียงนี่อาจไม่ถือ ค่าส่งคืนไม่เท่ากับการเรียกใช้ฟังก์ชันเนื่องจากค่าส่งคืนไม่มีผลข้างเคียง
การแก้ปัญหาคือจะหยุดการใช้ด้านผลกระทบและการเข้ารหัสผลกระทบเหล่านี้ในค่าตอบแทน ภาษาที่ต่างกันมีระบบเอฟเฟกต์ที่แตกต่างกัน เช่น Haskell ใช้ monads เพื่อเข้ารหัสเอฟเฟกต์บางอย่างเช่น IO หรือการกลายพันธุ์ของรัฐ ภาษา C / C ++ / Rust มีระบบประเภทที่สามารถไม่อนุญาตการกลายพันธุ์ของค่าบางค่า
ในภาษาที่จำเป็นprint("foo")
ฟังก์ชันจะพิมพ์บางอย่างและไม่คืนสิ่งใด ในภาษาที่ใช้งานได้จริงเช่น Haskell print
ฟังก์ชั่นยังใช้วัตถุที่แสดงสถานะของโลกภายนอกและส่งคืนวัตถุใหม่ที่เป็นตัวแทนของรัฐหลังจากดำเนินการเอาต์พุตนี้ newState = print "foo" oldState
สิ่งที่คล้ายกับ ฉันสามารถสร้างรัฐใหม่ให้มากที่สุดจากสถานะเดิมได้ตามต้องการ อย่างไรก็ตามฟังก์ชั่นหลักจะใช้เพียงอันเดียวเท่านั้น ดังนั้นฉันต้องเรียงลำดับสถานะจากการกระทำหลาย ๆ อย่างโดยการผูกมัดฟังก์ชัน จะพิมพ์ผมอาจจะพูดอะไรบางอย่างเช่นfoo bar
print "bar" (print "foo" originalState)
หากไม่ได้ใช้สถานะเอาต์พุต Haskell จะไม่ทำการกระทำที่นำไปสู่สถานะนั้นเนื่องจากเป็นภาษาสันหลังยาว ในทางกลับกันความเกียจคร้านนี้เป็นไปได้เพียงเพราะเอฟเฟกต์ทั้งหมดจะถูกเข้ารหัสอย่างชัดเจนว่าเป็นค่าตอบแทน
โปรดทราบว่า Haskell เป็นภาษาที่ใช้งานได้ทั่วไปเท่านั้นที่ใช้เส้นทางนี้ ภาษาที่ใช้งานอื่น ๆ รวมถึง ตระกูล Lisp ตระกูล ML และภาษาที่ใช้งานได้ใหม่เช่น Scala ไม่สนับสนุน แต่ให้ผลข้างเคียงที่ยังคงอยู่
การใช้ผลข้างเคียงสำหรับ I / O อาจใช้ได้ บ่อยครั้งที่ I / O (นอกเหนือจากการบันทึก) จะทำที่ขอบเขตด้านนอกของระบบของคุณเท่านั้น ไม่มีการสื่อสารภายนอกเกิดขึ้นภายในตรรกะทางธุรกิจของคุณ จากนั้นเป็นไปได้ที่จะเขียนหลักของซอฟต์แวร์ของคุณในสไตล์ที่บริสุทธิ์ในขณะที่ยังคงทำงาน I / O ที่ไม่บริสุทธิ์ในเปลือกนอก นี่ก็หมายความว่าแกนกลางสามารถไร้สัญชาติได้
การไร้สัญชาติมีข้อได้เปรียบในทางปฏิบัติหลายประการเช่นความมีเหตุผลที่เพิ่มขึ้นและความสามารถในการขยายระบบ สิ่งนี้เป็นที่นิยมอย่างมากสำหรับแบ็กเอนด์ของเว็บแอปพลิเคชัน สถานะใด ๆ จะถูกเก็บไว้ภายนอกในฐานข้อมูลที่ใช้ร่วมกัน ทำให้การปรับสมดุลโหลดง่าย: ฉันไม่ต้องติดเซสชันกับเซิร์ฟเวอร์เฉพาะ ถ้าฉันต้องการเซิร์ฟเวอร์เพิ่มเติม เพิ่มเพียงอีกเพราะใช้ฐานข้อมูลเดียวกัน เกิดอะไรขึ้นถ้าเซิร์ฟเวอร์หนึ่งล่ม ฉันสามารถทำซ้ำการร้องขอที่ค้างอยู่บนเซิร์ฟเวอร์อื่น แน่นอนว่ายังมีสถานะอยู่ - ในฐานข้อมูล แต่ฉันได้ทำให้มันชัดเจนและแยกมันและสามารถใช้วิธีการทำงานที่บริสุทธิ์ภายในถ้าฉันต้องการ