ความหมายของ "ไม่แต่ง" คืออะไร?


35

ฉันเห็นมากของตำราโดยเฉพาะอย่างยิ่งการทำงานตำราการเขียนโปรแกรมที่อ้างว่าบางแนวคิด CS "ไม่แต่ง" ตัวอย่างคือ: ล็อคไม่เขียน, monads ไม่ได้เขียน

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

ใครสามารถอธิบายความหมายของวลีนี้เมื่อใช้ในการแสดงออกเช่นสองตัวอย่างด้านบน (นั่นคือล็อคและพระ)


มันใกล้เคียงกับความหมายขององค์ประกอบของฟังก์ชันมากกว่าการรวมวัตถุ
Andres F.

ถ้าคุณมีสองสิ่งที่แยกต่างหากที่ใช้การล็อกอย่างไม่เป็นทางการและไม่เป็นทางการมันยากที่จะรวมเข้าด้วยกัน (ในกรณีของล็อคมันยากที่จะทำโดยไม่แนะนำการหยุดชะงักในกรณีของ monads ประเภทจะซับซ้อน)
user253751

คำตอบ:


35

เมื่อมีคนพูดว่า "X ไม่ได้เขียน" สิ่งที่พวกเขาหมายถึง "การเขียน" จริงๆเพียงแค่หมายความว่า "ใส่กัน" และสิ่งที่และวิธีการที่คุณเอามารวมกันจะแตกต่างกันมากขึ้นอยู่กับสิ่งที่ว่า "X" คือ

นอกจากนี้เมื่อพวกเขาพูดว่า "ไม่เขียน" พวกเขาสามารถหมายถึงสิ่งที่แตกต่างกันเล็กน้อย:

  1. คุณไม่สามารถรวม Xs สองตัวเข้าด้วยกันได้ตลอดเวลา
  2. คุณสามารถใส่ X สองตัวไว้ด้วยกัน แต่ผลลัพธ์อาจไม่ใช่ X (IOW: X ไม่ได้ปิดภายใต้การจัดองค์ประกอบ )
  3. คุณสามารถรวม Xs สองตัวเข้าด้วยกัน แต่ X ที่ได้นั้นอาจไม่เป็นไปตามที่คุณคาดหวัง

ตัวอย่างสำหรับ # 1 คือ parsers ที่มีสแกนเนอร์ / lexers คุณอาจได้ยินคำว่า "สแกนเนอร์ / lexers ไม่แต่ง" นั่นไม่จริงเลย สิ่งที่พวกเขาหมายถึงคือ "parser ที่ใช้เวที lexing แยกไม่ได้แต่ง"

ทำไมคุณต้องการเขียนโปรแกรมแยกวิเคราะห์? ลองจินตนาการว่าคุณเป็นผู้ขาย IDE เช่น JetBrains, Eclipse Foundation, Microsoft หรือ Embarcadero และคุณต้องการสร้าง IDE สำหรับเว็บเฟรมเวิร์ก ในการพัฒนาเว็บทั่วไปเรามักจะผสมผสานภาษาต่างๆ คุณมีไฟล์ HTML ที่มี<script>องค์ประกอบที่มี ECMAScript และ<style>องค์ประกอบที่มี CSS คุณมีไฟล์เทมเพลตที่ประกอบด้วย HTML ภาษาการเขียนโปรแกรมบางส่วนและเมตาซินไวยากรณ์ภาษาเทมเพลตบางส่วน คุณไม่ต้องการที่จะเขียนปากกาเน้นข้อความไวยากรณ์ที่แตกต่างกันสำหรับ "Python", "Python ฝังอยู่ในแม่แบบ", "CSS", "CSS ภายใน HTML", "ECMASCript", "ECMASCript", "ECMAScript ภายใน HTML", "HTML", "HTML ภายใน เทมเพลต "และอื่น ๆ เป็นต้น คุณต้องการเขียนปากกาเน้นข้อความสำหรับงูใหญ่หนึ่งสำหรับ HTML หนึ่งสำหรับภาษาแม่แบบและจากนั้นเรียบเรียงทั้งสามลงในปากกาเน้นข้อความไวยากรณ์สำหรับไฟล์แม่แบบ

อย่างไรก็ตาม lexer จะวิเคราะห์ไฟล์ทั้งหมดลงในสตรีมของโทเค็นซึ่งเหมาะสมสำหรับภาษานั้นเท่านั้น โปรแกรมแยกวิเคราะห์สำหรับภาษาอื่นไม่สามารถทำงานได้กับโทเค็นที่ lexer ส่งผ่าน ตัวอย่างเช่นตัวแยกวิเคราะห์ Python มักเขียนในลักษณะที่ lexer คอยติดตามการเยื้องและอัดฉีดINDENTและDEDENTโทเค็นปลอมในโทเค็นสตรีมโทเค็นจึงอนุญาตให้ parser ปราศจากบริบทแม้ว่าไวยากรณ์ของ Python จะไม่จริง HTML lexer จะไม่สนใจพื้นที่ว่างทั้งหมดเนื่องจากไม่มีความหมายใน HTML

อย่างไรก็ตามการแยกวิเคราะห์สแกนเนอร์ซึ่งเพียงแค่อ่านตัวอักษรสามารถส่งกระแสข้อมูลตัวละครไปยัง parser ที่แตกต่างกันซึ่งสามารถส่งกลับมาจึงทำให้ง่ายต่อการเขียน

ตัวอย่างสำหรับ # 2 คือสตริงที่มีเคียวรี SQL อยู่ คุณสามารถมีสองสตริงแต่ละอันมีเคียวรี SQL ที่ถูกต้องทางไวยากรณ์ในนั้น แต่ถ้าคุณต่อสองสตริงเข้าด้วยกันผลลัพธ์อาจไม่เป็นเคียวรี SQL ที่ถูกต้องทางไวยากรณ์ นั่นเป็นเหตุผลที่เรามีจีบราส์แบบสอบถามARelซึ่งทำขึ้น

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


1
กล่าวอีกนัยหนึ่ง“ ไม่ได้แต่ง” หมายถึง“ ไม่ได้สร้างกลุ่มย่อย” (หรือที่สำคัญกว่านั้นคือ monoid)
Jon Purdy

ฉันไม่แน่ใจว่าจำเป็นต้องมีความสัมพันธ์ทางเพศสัมพันธ์มากขึ้นเช่น Magma (ซึ่งฉันได้เรียนรู้เกี่ยวกับตัวอักษร 3 วินาทีที่ผ่านมา :-D)
Jörg W Mittag

อย่างไรก็ตามถ้าคุณถามใครสักคนว่าพวกเขาหมายถึงอะไรเมื่อพวกเขาพูดว่า "ล็อคไม่ได้แต่ง" ฉันค่อนข้างแน่ใจว่าพวกเขาจะไม่ตอบ "ฉันหมายความว่าชุดโปรแกรมที่เกิดขึ้นพร้อมกันที่ถูกต้องพร้อมล็อค .
Jörg W Mittag

ไม่แน่นอน เพียงแค่ประโยคอื่น ฉันมีความรู้สึกว่าการเชื่อมโยงจำเป็นต้องรักษาความรู้สึกขององค์ประกอบ "เรียบ" แต่ไม่มีข้อโต้แย้งที่แข็งแกร่งในการสำรองข้อมูล
Jon Purdy

20

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

บางสิ่งที่ช่วยให้องค์ประกอบสามารถจัดองค์ประกอบได้มากขึ้น:

  1. idempotence ฟังก์ชั่น idempotent จะสร้างผลลัพธ์หรือผลข้างเคียงเดียวกันเสมอหากเรียกหลาย ๆ ครั้งด้วยค่าพารามิเตอร์เดียวกัน สิ่งนี้ช่วยเพิ่มความสามารถในการเรียงความเนื่องจากผลลัพธ์ของการเรียกฟังก์ชันสามารถคาดเดาได้

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

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

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

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

วลี "monads not compose" ไม่สมเหตุสมผลกับฉันมากนัก จุดรวมของ monad คือการทำสิ่งที่เป็นประโยชน์เช่นอินพุตของแป้นพิมพ์หรือเอาท์พุทหน้าจอและทำให้มันกลายเป็นรูปแบบทางคณิตศาสตร์ที่บริสุทธิ์ยิ่งขึ้นซึ่งอันที่จริงแล้วเรียงความได้มากขึ้น


4
ฉันคิดว่าstackoverflow.com/questions/7040844/…ทำหน้าที่ได้ดีในการอธิบายว่า "monads not compose" อาจหมายถึงอะไรถึงแม้ว่าฉันจะยอมรับว่า monads นั้นแต่งได้ดีกว่าล็อค
Ixrec

จุด bullet ของคุณสำหรับ "อ้างอิงความโปร่งใส" และ "ความบริสุทธิ์" เป็นจริงทั้งสองต้องการความบริสุทธิ์ ควรหลีกเลี่ยงคำว่า "ความโปร่งใสในการอ้างอิง" เนื่องจากไม่ได้กำหนดอย่างชัดเจน
BlueRaja - Danny Pflughoeft

1
Monad เป็นโครงสร้างเกี่ยวกับพีชคณิตที่มีการดำเนินการบางอย่าง สิ่งที่คุณอธิบายไว้ในย่อหน้าสุดท้ายของคุณคือIOประเภทที่จับ "การกระทำ stateful" เช่นการป้อนข้อมูลแป้นพิมพ์ คุณค่าของการIOพิมพ์จริง ๆ แล้วแต่ง แต่มันเป็นประเภททั้งหมด IOที่เป็น monad ประเภทนี้ไม่ได้เขียนด้วยประเภทอื่น ๆ ที่เป็นพระเหมือนประเภทรายการ นั่นก็คือเราไม่สามารถมีระบบการผลิตชนิดIO . Listซึ่งพฤติกรรมเช่นทั้งสอง IOและListพร้อมกัน มันสมเหตุสมผลไหม ฉันไม่แน่ใจว่าฉันอธิบายได้ดี
Tikhon Jelvis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.