ความแตกต่างระหว่างฟังก์ชันชั้นหนึ่งและฟังก์ชันลำดับสูง


129

ฉันสงสัยว่า / สิ่งที่แตกต่างระหว่างฟังก์ชั่นเฟิร์สคลาสและการสั่งซื้อสูงฟังก์ชั่น

ฉันอ่านทั้งสองหน้า wiki และมันดูค่อนข้างคล้ายกัน ถ้าพวกเขาพูดถึงเรื่องเดียวกันทำไมต้องมีสองคำศัพท์?

พยายาม google แล้ว แต่ไม่พบสิ่งที่เป็นประโยชน์

คำตอบ:


154

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

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

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


2
ฉันคิดว่าสิ่งหนึ่งที่ทำให้ฉันสับสนได้ง่ายก็คือมันมีความสัมพันธ์กันอย่างใกล้ชิด
Simon

63
@Simon ฉันคิดว่ากุญแจสำคัญในการหลีกเลี่ยงความสับสนคือการจำไว้ว่าภาษาใดภาษาหนึ่งมีฟังก์ชันชั้นหนึ่ง (คุณสามารถพูดถึง "ชั้นหนึ่ง" สิ่งอื่น ๆ เช่นชั้นเรียนชั้นหนึ่งเป็นต้น) หรือไม่ก็ได้ ดังนั้นคุณจึงไม่เคยพูดถึงฟังก์ชั่นเฉพาะว่าเป็นชั้นหนึ่งหรือไม่ OTOH เมื่อคุณพูดว่าฟังก์ชันมีลำดับสูงกว่าหรือไม่นั่นก็แค่บอกว่ามันทำงานบนฟังก์ชันหรือไม่ดังนั้น "ลำดับที่สูงกว่า" จึงเป็นคุณสมบัติของแต่ละฟังก์ชัน ดังนั้น "มีฟังก์ชันชั้นหนึ่ง" จึงเป็นคุณสมบัติของภาษาและ "เป็นลำดับที่สูงกว่า" เป็นคุณสมบัติของฟังก์ชัน
เบ็น

เบ็นเป๊ะ ฉันคิดว่าทั้งสองเป็นคุณสมบัติสำหรับฟังก์ชันดังนั้นฉันจึงสับสน ขอบคุณความคิดเห็นของคุณ
Simon

นอกจากนี้โปรดทราบว่า "ฟังก์ชันชั้นหนึ่ง" ไม่เหมือนกับการรองรับการปิด ตัวอย่างเช่นใน C สนับสนุน "ฟังก์ชันชั้นหนึ่ง" ผ่านตัวชี้ฟังก์ชัน อย่างไรก็ตาม C ไม่สนับสนุนแนวคิดใด ๆ เกี่ยวกับฟังก์ชันซ้อนกันดังนั้นจึงไม่สนับสนุนการปิด
Tac-Tics

1
@ Tac-Tics คำจำกัดความเป็นเรื่องส่วนตัวและเปิดให้มีการอภิปราย แต่โดยส่วนตัวแล้วฉันชอบคิดว่า C รองรับเฉพาะฟังก์ชันลำดับที่สูงกว่า (ผ่านตัวชี้ฟังก์ชัน) อย่างไรก็ตามฟังก์ชันชั้นหนึ่งไม่ได้รับการสนับสนุนเนื่องจากฟังก์ชันด้อยกว่าประเภทค่าอื่น ๆ เช่นintหรือcharในแง่ที่ว่าไม่สามารถกำหนดอย่างชัดเจน (โดยเนื้อความของฟังก์ชัน) ได้ทุกที่ที่คุณต้องการ
wln Nirvana

67

ฟังก์ชันชั้นหนึ่งคือฟังก์ชันที่ถือว่าเป็นวัตถุ (หรือกำหนดให้กับตัวแปรได้)

ฟังก์ชันลำดับที่สูงกว่าคือฟังก์ชันที่ใช้ฟังก์ชันชั้นหนึ่งเป็นพารามิเตอร์อย่างน้อยหนึ่งฟังก์ชันหรือส่งกลับฟังก์ชันคลาสหนึ่งอย่างน้อยหนึ่งฟังก์ชัน


20

พวกเขาแตกต่างกัน

ฟังก์ชั่นชั้นหนึ่ง

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

ภาษาที่รองรับค่าที่มีประเภทฟังก์ชันและปฏิบัติเช่นเดียวกับค่าที่ไม่ใช่ฟังก์ชันกล่าวได้ว่ามี "ฟังก์ชันชั้นหนึ่ง"

ฟังก์ชั่นการสั่งซื้อที่สูงขึ้น

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

ตัวอย่างตามรูปแบบบัญญัติคือ "แผนที่"

map :: (a -> b) -> [a] -> [b]
map f []     = []
map f (x:xs) = f x : map f xs

นั่นคือใช้ฟังก์ชันและอาร์เรย์และส่งกลับอาร์เรย์ใหม่พร้อมกับฟังก์ชันที่ใช้กับแต่ละองค์ประกอบ

ภาษาที่ใช้งานได้ - ภาษาที่ฟังก์ชันเป็นเครื่องมือหลักในการสร้างโปรแกรม - ทั้งหมดมีฟังก์ชันชั้นหนึ่ง ส่วนใหญ่ยังมีฟังก์ชันลำดับที่สูงกว่า (ข้อยกเว้นที่หายากมากคือภาษาเช่น Excel ซึ่งอาจกล่าวได้ว่าใช้งานได้ แต่ไม่ใช่ลำดับที่สูงกว่า)


1
ขอบคุณดอน. มันครอบคลุม และฉันคิดว่าเฟส "หนึ่งในผลที่ตามมา" บ่งบอกถึงความสัมพันธ์แบบหนึ่งระหว่างสองคนนั้น
Simon

10

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

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

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


คุณช่วยยกตัวอย่างได้ไหมว่าฟังก์ชันลำดับที่สูงกว่าไม่ใช่ฟังก์ชันชั้นหนึ่ง (ฉันคิดว่าทั้งคู่เหมือนกัน)
ถึง

@ เธอฉันไม่มีตัวอย่างที่เป็นรูปธรรมของภาษาที่จะทำให้เป็นตัวเลือกการออกแบบสำหรับฟังก์ชันเช่นนี้ แต่สิ่งที่คล้ายกันคือกรณีเช่นกับเทมเพลตใน C ++: แม่แบบมีลำดับที่สูงกว่า (คุณสามารถมี "พารามิเตอร์เทมเพลต") แต่ไม่ใช่ค่าชั้นหนึ่งกล่าวคือเทมเพลตไม่สามารถเป็นพารามิเตอร์ของฟังก์ชันธรรมดาได้ เช่นเดียวกับโมดูล / functors ใน ML
Andreas Rossberg

@AndreasRossberg Java 8 จะไม่ใช่คำตอบที่ถูกต้องสำหรับคำถามของเขาหรือไม่? ฟังก์ชันไม่ใช่พลเมืองชั้นหนึ่ง แต่เมธอด Java สามารถรับฟังก์ชัน (ผ่านอินเตอร์เฟสการทำงาน) ตามที่คุณอธิบายไว้ว่า "พารามิเตอร์ที่เป็นฟังก์ชันได้รับการปฏิบัติเป็นพิเศษและแตกต่างจากพารามิเตอร์ค่า" ธรรมดา "
อับดุล

1

ฟังก์ชันชั้นหนึ่งสามารถ:

  • เก็บไว้ในตัวแปร
  • ถูกส่งกลับจากฟังก์ชัน
  • ถูกส่งผ่านเป็นอาร์กิวเมนต์ไปยังฟังก์ชันอื่น

High Order Functionคือฟังก์ชันที่ส่งกลับฟังก์ชันอื่น

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

function highOrderFunc() {
  return function () {
    alert('hello');
  };
}

0

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

ตัวอย่างเช่นกำหนดให้กับตัวแปรส่งผ่านไปรอบ ๆ สร้างขึ้นทันที

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