รหัส“ แลมบ์ดา” คืออะไร?


17

ฉันเพิ่งได้ยินคนพูดถึงรหัสเป็น "แลมบ์ดา" ฉันไม่เคยได้ยินวลีนี้มาก่อน มันหมายความว่าอะไร?


มันทำ. หลายครั้ง. ฉันลองมันสองสามครั้ง - แต่น่าเศร้าที่ไม่ประสบความสำเร็จ บางทีคุณอาจมีโชคเพิ่มเติม ขอบคุณผู้ที่ตอบโต้
Oliver Moran

10
@Oliver ส่วนหนึ่งของการถามคำถามที่นี่ก็เพื่อแสดงให้เห็นว่าคุณได้ทำอะไรเพื่อตอบคำถามนั้นเพื่อให้ผู้คนไม่ได้ลองทำสิ่งเดียวกับที่คุณทำและติดอยู่ ด้วยการระบุว่าในวิกิพีเดียหรือลิงค์ของ Google คุณพบว่าคุณสับสนทำให้คำถามของคุณได้รับคำตอบที่ดีขึ้นในระดับทั่วไปคำตอบอาจไม่ตรงตามที่คุณต้องการเพราะเป็นเพียงการอ้างอิงสิ่งที่คุณไม่เคยทำมาก่อน เพียงลองทำสิ่งที่คนอื่นโพสต์และดูว่าเกิดอะไรขึ้น คุณอาจประหลาดใจกับผลลัพธ์ที่ได้
JB King

7
ฉันรู้สึกว่าแร็พสามารถทำจากสิ่งนี้ - "รหัสของฉันแลมบ์ดา" แต่ฉันไม่สามารถจังหวะมันคุ้มค่าอะไร :-)
พอลนาธาน

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

2
@ พอลนาธาน - คุณกำลังรหัสเพื่อแลมบ์ดาคุณชัดเจนไม่เคยวางแผนที่จะทำงานเพื่อมาตรฐานใด ๆ ; มันหยาบกว่า sander!
glenatron

คำตอบ:


20

นิพจน์แลมบ์ดาเป็นทั้งนามธรรม (บางครั้งเรียกว่าฟังก์ชันที่ไม่ระบุตัวตน) แอปพลิเคชันหรือตัวแปร (ภาษาส่วนใหญ่ยังเพิ่มค่าคงที่ในรายการนี้) ศัพท์ของแลมบ์ดาไม่จำเป็นต้องทำหน้าที่และไม่จำเป็นต้องผ่านเป็นพารามิเตอร์แม้ว่าจะเป็นวิธีปฏิบัติทั่วไป

ตัวอย่างทั่วไปของการแสดงออกแลมบ์ดาใน C #

ตัวอย่างเช่น:

List<int> items = new List<int>();
items.add(1);
items.add(2);
items.add(1);
items.add(3);

int CountofOnes = items.FindAll(item => item == 1).Count();

Console.Out.WriteLine(CountofOnes);

จะส่งออก: 2

ในรหัสนี้ฉันส่งแลมบ์ดาก่อสร้างให้กับFindAllฟังก์ชั่นของListวัตถุของ. NET

items.FindAll(item => item == 1)

แลมบ์ดาในการเรียกครั้งนี้ดำเนินการสมการง่าย ๆ และคืนค่าบูลีนโดยบอกFindAllว่าต้องทำอะไร


2
ไม่เป็นความจริงเลย การแสดงออกของแลมบ์ดาเป็นทั้งนามธรรม (ไม่จำเป็นต้องเล็ก ) แอปพลิเคชันหรือตัวแปร (ภาษาส่วนใหญ่จะเพิ่มค่าคงที่ในรายการนี้) คำศัพท์แลมบ์ดาไม่จำเป็นต้องทำหน้าที่และไม่จำเป็นต้องผ่านเป็นพารามิเตอร์
SK-logic

คุณพูดถูกฉันจะทำลายคำตอบเพื่อความชัดเจน
Timothy Groote

3
โปรดยกตัวอย่างนิพจน์แลมบ์ดาที่ไม่ใช่ฟังก์ชันโปรด
Ingo

1
@Ingo นี่เป็นคำศัพท์เฉพาะของแลมบ์ดาแคลคูลัสแน่นอน en.wikipedia.org/wiki/Lambda_calculus#Lambda_terms
SK-logic

1
@ SK-logic ฉันชอบที่จะเห็นมันแตกต่างกัน ภาษาอย่าง Haskell และ C # ช่วยให้สามารถผูกฟังก์ชั่นกับชื่อในการสร้าง (REC) หรือในรูปแบบของ "super-combinators" (เช่นการผูกฟังก์ชันระดับบนสุด) และสิ่งนี้ฉันเห็นว่าเป็นความแตกต่างที่ร้ายแรงที่ฉันทำ ไม่รู้สึกว่ามันถูกต้องที่จะใช้คำศัพท์แลมบ์ดาดั้งเดิมที่นี่ เพราะไม่มีสิ่งใดที่เป็นไปได้ใน LC (นั่นคือสาเหตุที่คุณต้องมี Y combinator สำหรับการเรียกซ้ำ) ผลลัพธ์ของ ((\ xy -> x) a) และ (const a) ใน Haskell เหมือนกันและทั้งคู่เป็นแอพพลิเคชั่น แต่ฉันจะใช้คำแรกเท่านั้นว่า
Ingo

3

ฟังก์ชั่นที่ไม่ระบุชื่อ (ไม่มีชื่อ) หรือวัตถุที่มักจะ inline เป็นอาร์กิวเมนต์ให้กับฟังก์ชั่นอื่น

ดังนั้นเนมสเปซจึงมีมลพิษน้อย


1

แลมบ์ดามักจะอ้างถึงการแสดงออกของฟังก์ชั่นในบริบทการเขียนโปรแกรมการทำงาน

นี่คือการแสดงออกแลมบ์ดาในงูหลาม:

lambda x: x + 1

แสดงให้เห็นถึงฟังก์ชั่นที่เพิ่มขึ้นของพารามิเตอร์xโดย 1

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