ภาษาแลมบ์ดาคืออะไร?


90

ฉันกำลังอ่าน "JavaScript: The Good Parts" และผู้เขียนระบุว่า JavaScript เป็นภาษาแรกของแลมบ์ดาที่เปิดตัว

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

ฉันไม่เข้าใจว่าภาษาแลมด้าคืออะไร ภาษาดังกล่าวมีคุณสมบัติอย่างไรและแตกต่างจากภาษาเช่น Java, C, C ++ และ Php อย่างไร


6
แลมด้าหมายถึงการแสดงออกที่ไม่ระบุตัวตน ดังนั้นภาษาแลมบ์ดา -> ภาษาที่มีนิพจน์ไม่ระบุตัวตน
bevacqua

ลิงก์ Google หนังสือ FYI: books.google.co.uk/…
Lucas Jones

3
ดูแคลคูลัสแลมบ์ดาในวิกิพีเดีย
Oded

คำตอบที่ดีมากมาย สิ่งที่ฉันเข้าใจในตอนนี้คือถ้าคุณใช้ฟังก์ชั่นนิรนามแสดงว่าคุณกำลังทำงานกับภาษาแลมบ์ดา นั่นคือความเข้าใจที่ถูกต้องว่าภาษา lamda แตกต่างจากภาษาเช่น java อย่างไร
sushil bharwani

4
"ฉันกำลังอ่าน" JavaScript: The Good Parts "และผู้เขียนระบุว่า JavaScript เป็นภาษาแรกของแลมบ์ดาที่เปิดตัว" ดังนั้นฉันจึง googled ภาษาแลมบ์ดาและพบคำถามนี้ใน SO :)
Bugs Bunny

คำตอบ:


38

ฉันไม่เคยได้ยินใครใช้คำว่า "ภาษาแลมบ์ดา" และคำจำกัดความที่เป็นไปได้เพียงอย่างเดียวที่ฉันคิดได้คือการยกเว้น JavaScript เป็น "คำแรก"

ที่กล่าวว่าฉันสงสัยว่าเขาอาจหมายถึง:

  • ภาษาที่ใช้งานได้: คลาสของภาษาที่การคำนวณ (หรือสามารถเป็นได้) ถูกจำลองเป็นองค์ประกอบที่ไม่มีสถานะของฟังก์ชัน (อาจเป็นลำดับที่สูงกว่า) LISP, Scheme, ML, Haskell และอื่น ๆ มักถูกกำหนดไว้ในคลาสนี้แม้ว่าหลาย ๆ ตัวจะเป็นกระบวนทัศน์ที่ผสมกันอย่างเหมาะสมหรือภาษา "functional optional" เนื้อหา Javascript มีคุณลักษณะที่จำเป็นเพื่อให้ "รูปแบบการทำงาน" ของการเขียนโปรแกรมเป็นไปได้
  • ภาษาที่อนุญาตให้สร้างฟังก์ชันที่ไม่ระบุตัวตน (โดยใช้functionไวยากรณ์ใน JavaScript ซึ่งเขียนlambdaในหลายภาษาจึงอาจเป็น "ภาษาแลมบ์ดา"

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

แก้ไข: ดูผลลัพธ์ของ Google หนังสือ --- "ก่อนอื่นไปที่กระแสหลัก"; นั่นเป็นเรื่องที่เถียงได้ ฉันจะหยิบยกว่า LISP เป็นกระแสหลักที่สมเหตุสมผลอย่างน้อยที่สุด แม้ว่าจะเป็นประเด็นที่ยุติธรรมความหมายของ JavaScript ได้รับแรงบันดาลใจโดยตรงจาก Scheme และแน่นอนว่ามันเข้าถึงผู้ชมได้มากกว่าภาษาอื่น ๆ ที่สามารถอ้างสิทธิ์ในลักษณะเดียวกันได้


โปรดดูลิงก์ที่โพสต์โดยลิงก์หนังสือลูคัสโจนส์ Google ซึ่งเขานำไปยังหน้าที่ฉันกำลังพูดถึง ขอบคุณสำหรับคำตอบของคุณ
sushil bharwani

5
เหตุผลที่ JavaScript ถูกอธิบายว่าเป็น 'ตัวแรก' เนื่องจากคำสั่งนี้มีคุณสมบัติเป็น 'to go mainstream' ฉันคิดว่าค่อนข้างชัดเจนว่า JavaScript เป็นภาษารูปแบบการทำงานตัวแรกที่โปรแกรมเมอร์ใช้งานทุกวันในงานทุกวัน
rfunduk

1
คุณหมายถึงอะไรเมื่อคุณพูดว่า "รูปแบบการทำงาน" ของภาษาโปรแกรม ฉันมาจากพื้นหลัง java และพยายามเรียนรู้ javascript ว่ามันแตกต่างกันอย่างไร
sushil bharwani

9
เป็นหัวข้อใหญ่ในการสำรวจ ปีที่แล้วฉันอยู่ที่คุณตอนนี้: ฉันได้พบบทความและการบรรยายของ Crockford และต้องการทำความเข้าใจกับการปิด ฉันขอแนะนำให้คุณเริ่มต้นด้วย Wikipedia จากนั้นไปยังบทความสองสามบทความ: John Hughes "ทำไมต้องมีการเขียนโปรแกรมเชิงฟังก์ชัน" scribd.com/doc/26902/whyfp , Slava Akhmechet "การเขียนโปรแกรมเชิงฟังก์ชันสำหรับพวกเราที่เหลือ" defmacro.org/ramblings /fp.htmlมีหนังสือมากมายที่จะขยายความคิดของคุณ: ตรวจสอบ Little Schemer เพื่อทำความเข้าใจกับ Scheme จากนั้นไปที่โครงสร้างและการตีความโปรแกรมคอมพิวเตอร์
michiakig

5
@sushil: มีวรรณกรรมเกริ่นนำมากมายในหัวข้อนี้ โดยทั่วไปแล้วมันเป็นรูปแบบของการเขียนโปรแกรมที่เน้นการปฏิบัติต่อโปรแกรมเป็นวัตถุทางคณิตศาสตร์มากกว่าคำสั่งตามลำดับหรือการโต้ตอบระหว่างวัตถุนามธรรม ตัวอย่างเช่นภาษาที่ใช้งานได้จะชอบการเรียกซ้ำเพื่อการวนซ้ำใช้ประโยชน์จากโครงสร้างข้อมูลที่ไม่เปลี่ยนรูปและใช้ฟังก์ชันลำดับที่สูงขึ้นตามความต้องการของ "วัตถุฟังก์ชัน" หรือ "รูปแบบกลยุทธ์" ฟังก์ชันลำดับที่สูงกว่าหมายถึงฟังก์ชันที่อาจทำงานบน (เป็นอาร์กิวเมนต์) หรือให้ผลตอบแทน (เป็นค่าส่งคืน) ฟังก์ชันอื่น ๆ
Derrick Turk

48

ภาษาแลมบ์ดาเป็นภาษาที่อนุญาตให้ส่งผ่านฟังก์ชันไปยังฟังก์ชันอื่นโดยที่ฟังก์ชันจะถือว่าเป็นตัวแปรอื่น ๆ นอกจากนี้คุณควรกำหนดฟังก์ชันนี้ให้ส่งโดยไม่ระบุตัวตนได้ (หรือในบรรทัด) PHP 5.3 เพิ่มการรองรับฟังก์ชันแลมด้า JavaScript เป็นภาษาหลักแรกหรือไม่? Lisp ถูกใช้กันอย่างแพร่หลายในการตั้งค่าการศึกษาก่อน JavaScript และในการปรับแต่ง Emac ที่รักของเราhttp://www.gnu.org/software/emacs/manual/html_node/eintr/

นี่คือตัวอย่าง

function applyOperation(a, b, operation) {
  return operation(a,b);
}

function add(a,b) { return a+ b; }
function subtract(a,b) {return a - b;}

// Can be called like
applyOperation(1,2, add);
applyOperation(4,5, subtract);
// Anonymous inline function
applyOperation(4,7, function(a,b) {return a * b})

แตกต่างจาก C อย่างไร? ใน C คุณสามารถส่งตัวชี้ไปยังฟังก์ชันได้ แต่ไม่สามารถกำหนดแบบอินไลน์โดยไม่ระบุตัวตนได้

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


1
"เสียงกระเพื่อมถูกใช้กันอย่างแพร่หลาย" โดยใคร? ฉันรู้เรื่องนี้มาตลอดเนื่องจากอาจารย์มักจะพูดคุยกัน แต่ในทางปฏิบัติฉันไม่เคยพบใครที่ใช้ Lisp ฉันจะบอกว่าทุกคนสามารถหาคนที่พวกเขารู้จักที่ใช้ Javascript ซึ่งทำให้ Javascript เป็น "กระแสหลัก" มากขึ้น
palswim

"PHP 5 เพิ่มการรองรับฟังก์ชันแลมบ์ดา" จริงๆแล้ว iy คือ PHP 5.3 ที่แนะนำฟังก์ชันแลมบ์ดา
Crozin

ฉันเคยพบคนไม่กี่คนที่ใช้มันในบริบททางธุรกิจ แต่ก็เหมือนกับ Pascal ที่ครั้งหนึ่งมันถูกใช้กันอย่างแพร่หลายในสถานศึกษา
Juan Mendes

4

เขาหมายถึงแลมบ์ดาแคลคูลัส

แลมบ์ดาแคลคูลัสหรือที่เขียนว่าλ-แคลคูลัสเป็นระบบที่เป็นทางการสำหรับการกำหนดฟังก์ชันการใช้ฟังก์ชันและการเรียกซ้ำ [... ]

[... ] ด้วยแคลคูลัสแลมบ์ดาที่ไม่ได้พิมพ์เป็นแรงบันดาลใจดั้งเดิมสำหรับการเขียนโปรแกรมเชิงฟังก์ชันโดยเฉพาะอย่างยิ่ง Lisp และแคลคูลัสแลมบ์ดาที่พิมพ์เพื่อเป็นรากฐานสำหรับระบบประเภทสมัยใหม่


4

ฉันเคยเห็นแลมบ์ดาที่กำหนดให้เป็นฟังก์ชันที่ไม่ระบุตัวตนและเป็นการอ้างอิงถึงฟังก์ชัน Javascript รองรับทั้ง:

setTimeout(function(){ /* an anonymous function */ }, 100)

var f = function(){ /* function ref */ }

นี่คือจุดที่ JS ได้รับพลังและความยืดหยุ่นมากมาย Java สนับสนุนตัวแรกในระดับหนึ่ง (การใช้งานอินเทอร์เฟซแบบไม่ระบุชื่อ) แต่ไม่ใช่เวอร์ชันหลัง - ดูด้านล่างสำหรับการอัปเดตสำหรับ Java 8

มันไม่ชัดเจนสำหรับฉันว่า (หรือทั้งสองอย่าง) เป็นคำจำกัดความที่เหมาะสมของแลมด้า

JS ไม่ใช่ภาษาแรกที่รองรับคุณสมบัติเหล่านี้อย่างแน่นอน จากความทรงจำฉันคิดว่ามันเป็นเรื่องเล็ก ๆ น้อย ๆ ที่ผู้ที่ชื่นชอบภาษามักจะพูดถึงการสนับสนุน lambdas

BTW: ใน Java คลาสที่ไม่ระบุตัวตนมักใช้เพื่อส่งผ่านนิยามคลาสได้ทันทีสำหรับอาร์กิวเมนต์ (ใช้มากในการแกว่ง) สิ่งนี้ (จากหน่วยความจำไม่ได้รวบรวม):

someGuiContainer(new WidgetInterface()
      {
           public void importantMethodToDefine(){
             // Handle having the method called in my special widget way
           }
        }
)

อัปเดต

Java เมื่อวันที่ 8 ปัจจุบันเป็นภาษาแลมบ์ดาอย่างเป็นทางการ

ตอนนี้คุณสามารถใช้ไวยากรณ์ต่อไปนี้:

MathOperation addition = (int a, int b) -> a + b;
System.out.println("10 + 5 = " + tester.operate(10, 5, addition));

ที่มาของรหัส


1

ในเครื่องมือหลักสูตรแบบเปิดของ MIT เรียกว่าโครงสร้างและการตีความโปรแกรมคอมพิวเตอร์หนังสือโดย Hal Abelson's, Jerry Sussman's และ Julie Sussman's พวกเขาพูดคุยเกี่ยวกับ Scheme ซึ่งเป็นภาษาถิ่นของ LISP และที่นั่นพวกเขาอธิบายคำอธิบายที่ละเอียดและชัดเจนว่าแลมด้าคืออะไรและ Scheme LISP และภาษาโดยทั่วไป ฉันขอแนะนำให้คุณดูหากคุณต้องการมีความเข้าใจอย่างชัดเจนและลึกซึ้งเกี่ยวกับการเขียนโปรแกรมคอมพิวเตอร์ ในการอธิบายให้คุณเข้าใจว่าคุณต้องใช้เวลามากเป็นสามเท่าหากคุณไปที่นั่นและเพียงแค่อ่านหนังสือหรือดูแบบฝึกหัดที่อธิบายได้อย่างสมบูรณ์แบบนั่นคืออัจฉริยะ

Javascript มีพื้นฐานมาจาก Scheme ภาษาเป็นหลักและเป็นพ่อของ Lisp และนอกจากนี้ยังใช้โครงสร้าง lamda และเป็นกระแสหลักด้วย


0

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

>>> list = ['woman', 'man', 'horse', 'boat', 'plane', 'dog']
>>> sorted(list, key=lambda word: word[-1])
['horse', 'plane', 'dog', 'woman', 'man', 'boat']

* In the C# programming language a lambda expression is an anonymous function that can contain expressions and statements

0
  • JavaScript อนุญาตให้กำหนดฟังก์ชัน Anonymous ซึ่งเป็นฟังก์ชันที่ไม่ผูกมัดกับตัวระบุ ฟังก์ชันดังกล่าวเรียกอีกอย่างว่า Lambda Abstraction และเนื่องจาก JS รองรับสิ่งนี้จึงเรียกว่า Lambda Language

  • คุณสมบัติ: จำเป็นต้องใช้ฟังก์ชันนี้ในกรณีที่เรียกใช้ฟังก์ชันทันทีหรือสำหรับการใช้งานระยะสั้นซึ่งไม่มีความสำคัญในการตั้งชื่อให้กับฟังก์ชัน

  • มันแตกต่างจากภาษาเช่น Java, C, C ++ และ PHP เนื่องจากในฟังก์ชัน JS Anonymous ใช้สำหรับการปิดและการแกง

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