วิธีหนึ่งในการดูแนวคิดทั้งสองนี้คือการกล่าวว่าการจับคู่รูปแบบเป็นคุณลักษณะของภาษาโปรแกรมสำหรับการรวมการเลือกปฏิบัติบนคอนสตรัคเตอร์และคำที่ทำลาย (ในขณะเดียวกันการเลือกและการตั้งชื่อส่วนคำศัพท์เฉพาะ) อย่างปลอดภัยกะทัดรัดและมีประสิทธิภาพ การวิจัยเกี่ยวกับการจับคู่รูปแบบโดยทั่วไปมุ่งเน้นที่ประสิทธิภาพการใช้งานเช่นวิธีการลดจำนวนของการเปรียบเทียบกลไกการจับคู่ที่ต้องทำ
ในทางตรงกันข้ามคำว่าการเขียนใหม่เป็นแบบจำลองทั่วไปของการคำนวณที่ตรวจสอบวิธีการที่หลากหลาย (อาจไม่ใช่แบบกำหนดค่าได้) ของการแทนที่คำย่อยของการแสดงออกทางวากยสัมพันธ์ การวิจัยเกี่ยวกับระบบการเขียนคำใหม่มักเกี่ยวกับคุณสมบัติเชิงนามธรรมของระบบการเขียนซ้ำเช่นการบรรจบกันการกำหนดและการเลิกจ้างและโดยเฉพาะอย่างยิ่งเกี่ยวกับวิธีการที่คุณสมบัติดังกล่าวเป็นหรือไม่ได้รับการเก็บรักษาไว้โดยการดำเนินงานเชิงพีชคณิต
เห็นได้ชัดว่ามีการทับซ้อนแนวคิดระหว่างทั้งสองและความแตกต่างคือระดับดั้งเดิมมากกว่าทางเทคนิค ความแตกต่างทางเทคนิคคือคำว่าการเขียนใหม่เกิดขึ้นภายใต้บริบทโดยพลการ (เช่นกฎทำให้เกิดการเขียนซ้ำสำหรับบริบทโดยพลและการแทนที่ ) ในขณะที่ การจับคู่รูปแบบในภาษาสมัยใหม่เช่น Haskell, OCaml หรือ Scala ให้การเขียนใหม่ 'ที่ด้านบน' ของคำศัพท์เท่านั้น ฉันคิดว่าข้อ จำกัด นี้ก็เช่นกันในแคลคูลัสรูปแบบของเจย์ ให้ฉันอธิบายสิ่งที่ฉันหมายถึงโดยข้อ จำกัด นี้ ด้วยการจับคู่รูปแบบในความหมายของ OCaml, Haskell, Scala คุณจะไม่สามารถพูดอะไรได้(l,r)C[lσ]→C[rσ]C[.]σ
match M with
| C[ x :: _ ] -> printf "%i ...\n" x
| C[ [] ] -> printf "[]"
ที่C[.]
นี่คืออะไร มันควรจะเป็นตัวแปรที่อยู่ในบริบทหนึ่งเดียว แต่ภาษาอย่าง OCaml, Haskell หรือ Scala ไม่ได้ให้ตัวแปรโปรแกรมเมอร์ที่อยู่ในบริบทของบริบท (หนึ่ง -eded) เฉพาะตัวแปรที่ช่วงค่า กล่าวอีกนัยหนึ่งในภาษาดังกล่าวคุณไม่สามารถจับคู่รูปแบบที่ตำแหน่งโดยพลการในคำศัพท์ คุณต้องระบุเส้นทางจากรูทของรูปแบบไปยังส่วนต่าง ๆ ที่คุณสนใจฉันเดาว่าเหตุผลสำคัญสำหรับการกำหนดข้อ จำกัด นี้ก็คือมิฉะนั้นการจับคู่รูปแบบจะไม่กำหนดขึ้นเนื่องจากคำอาจตรงกับรูปแบบใน มากกว่าหนึ่งวิธี ตัวอย่างเช่นคำที่(true, [9,7,4], "hello", 7)
ตรงกับรูปแบบC[7]
ในสองวิธีสมมติว่าC[.]
อยู่ในช่วงบริบทดังกล่าว