จากการอภิปรายความคิดเห็นที่นี่ฉันสงสัยว่าคุณสามารถเรียนรู้การเขียนโปรแกรมฟังก์ชั่นใน C?
จากการอภิปรายความคิดเห็นที่นี่ฉันสงสัยว่าคุณสามารถเรียนรู้การเขียนโปรแกรมฟังก์ชั่นใน C?
คำตอบ:
เห็นได้ชัดว่าคุณสามารถทำการเขียนโปรแกรมเชิงฟังก์ชันใน C ในทางทฤษฎีคุณสามารถเรียนรู้หลักการทำงานของการเขียนโปรแกรมใน C แต่ภาษานั้นไม่ได้ทำให้ง่ายขึ้น
ฉันคิดว่าคุณมีพื้นหลังอย่างน้อยใน OOP ถ้าคุณทำคุณควรตระหนักว่า OOP สามารถทำได้ใน C รวมถึง polymorphism, getters / setters, กฎการมองเห็น ฯลฯ เป็นต้น แต่มันค่อนข้างเจ็บปวดที่ต้องทำเช่นนั้นและคุณต้องรู้ทั้ง OOP และ C ภายใน ดึงมันออกมา มันเหมือนกันมากกับ FP
สิ่งที่คุณควรทำคือเรียนรู้ภาษาการเขียนโปรแกรมที่ใช้งานได้ (ส่วนใหญ่มีกฎไวยากรณ์แบบง่าย ๆ ที่น่าแปลกใจไม่ใช่ไวยากรณ์ที่ทำให้เรียนรู้ได้ยาก) จากนั้นให้ปัญญาที่ได้มาใหม่มีอิทธิพลต่อวิธีที่คุณเขียน C
ตามคำขอมีบางสิ่งที่คุณสามารถเรียนรู้จาก FP จากนั้นนำไปใช้พูด, C, C ++ หรือ Java:
C สามารถถูกแฮ็กเพื่อเสนอแนวคิดการทำงานบางอย่าง:
คำถาม StackOverflowนี้จะบอกคุณมากกว่านี้ แต่ดูเหมือนว่าจะเป็นไปได้ที่จะทำการเขียนโปรแกรมใช้งานได้ (หรือส่วนย่อยขนาดใหญ่) ใน C, แฮ็คและส่วนขยายคอมไพเลอร์และสิ่งที่ไม่ใช่วิธีที่ดีที่สุดในการเรียนรู้แนวคิด
ที่จริงการเรียนรู้การทำงานการเขียนโปรแกรมทางออกที่ดีที่สุดของคุณเป็นหนึ่งที่โดดเด่นภาษาเขียนโปรแกรมการทำงานเช่นเสียงกระเพื่อมและภาษาท้องถิ่นของตน ( Clojure , Scheme ) ErlangและHaskell หนึ่งในนั้นเป็นเครื่องมือที่สมบูรณ์แบบที่ทำงานภายในความคิดการเขียนโปรแกรมการทำงาน F #เป็นตัวเลือกที่ดีเช่นกันหากคุณมีพื้นหลังเป็น. Net แต่เป็นภาษาแบบหลายกระบวนทัศน์ไม่ใช่ภาษาโปรแกรมที่ใช้งานได้อย่างเคร่งครัด
ในฐานะที่เป็นtdammersบันทึกในความคิดเห็น:
จริงๆแล้ว LISP, clojure และแบบแผนก็เป็นแบบหลายกระบวนทัศน์เช่นกัน Haskell ในขณะที่บริสุทธิ์และขี้เกียจเริ่มต้นยังช่วยให้การเขียนโปรแกรมที่จำเป็นในขณะที่อยู่ในบริบท monadic และได้รับการสนับสนุนอย่างกว้างขวางสำหรับการประมวลผลพร้อมกัน ทั้งหมดนี้มีกลไกที่ใช้ส่วนใหญ่ของภูมิปัญญาที่รวบรวมในโลก OOP - การห่อหุ้มการสืบทอดความรับผิดชอบเดี่ยวองค์ประกอบ ฯลฯ มันไม่ได้เกี่ยวกับว่าภาษาอนุญาตกรอบความคิดอื่น ๆ หรือไม่ มันเกี่ยวกับกระบวนทัศน์ที่เป็นจุดเริ่มต้นของภาษา
ที่ดีที่สุดของความรู้ของฉันชัดและภาษาท้องถิ่นและ Erlang มีผู้สมัครที่ดีกว่า F # เพราะพวกเขาสนับสนุนให้เขียนโปรแกรมการทำงานมากกว่ากระบวนทัศน์อื่น ๆ สิ่งที่tdammersสวยงามสหรัฐอเมริกาเป็นจุดเริ่มต้นของภาษา F # ครอบคลุมการเขียนโปรแกรมที่ใช้งานได้ แต่ไม่สนับสนุนให้ใช้กับกระบวนทัศน์อื่น ๆ ที่สนับสนุนความจำเป็นและการเขียนโปรแกรม oo
คุณไม่สามารถเรียนรู้ทุกแง่มุมของการเขียนโปรแกรมเชิงฟังก์ชันใน C แต่แน่นอนคุณสามารถเริ่มต้นการเขียนโปรแกรมสไตล์การทำงานด้วยภาษาที่จำเป็นใด ๆ บิตเริ่มต้นเหล่านี้คือ - "ทำอย่างไรให้บริสุทธิ์ในขณะตั้งโปรแกรม" และก็สามารถทำ C ได้ด้วย ตรวจสอบโพสต์บล็อกนี้เพื่อดูรายละเอียด -
http://www.johndcook.com/blog/2011/07/24/get-started-functional-programming/
การเขียนโปรแกรมฟังก์ชั่นเป็นเรื่องเกี่ยวกับการปิดและการใช้งานของพวกเขา ถ้าไม่มีใครสามารถแสดงไลบรารี่การปิดโคตรของ C ให้คุณลืมใช้ C เพื่อเรียนรู้การเขียนโปรแกรมที่ใช้งานได้
แนวคิดสำคัญของการเขียนโปรแกรมฟังก์ชั่นคือความคิดของการปิดที่พูดคร่าว ๆ จับฟังก์ชั่นพร้อมกับตัวแปรผูก นอกเหนือจากการใช้งานการปิดที่แพร่หลายแล้วยังมีคุณสมบัติพิเศษอีกสองสามประการในการเขียนโปรแกรมเชิงฟังก์ชันเช่นการใช้ฟังก์ชั่นแบบเรียกซ้ำและค่าที่ไม่เปลี่ยนรูปแบบ (ทั้งคู่เล่นด้วยกันได้ดี) ลักษณะเหล่านี้เป็นปัญหาทางวัฒนธรรมมากกว่าสิ่งอื่นใดและไม่มีสิ่งกีดขวางทางเทคนิคในการใช้ภาษาใด ๆ นี่คือเหตุผลที่ฉันมุ่งเน้นไปที่การปิดคำตอบของฉัน: ไม่ใช่ทุกภาษาที่อนุญาตให้สร้างการปิดได้อย่างง่ายดาย
การใช้งานทั่วไปของการปิดคือการใช้กลไกความเป็นส่วนตัว ตัวอย่างเช่นรหัส Javascript - ในตัวอย่างที่ฉันเลือก Javascript เพราะเป็นภาษาที่ใช้งานได้กับ“ C-like syntax” และคำถามของคุณแนะนำว่าคุณคุ้นเคยกับ C:
create_counter = function()
{
var x = 0;
var counter = function()
{
++x;
return x;
};
return counter;
}
จากนั้นด้วย
a = create_counter();
b = create_counter();
เรามีสองฟังก์ชั่นa
และการb
นับคอลเลกชันที่แยกจากกัน ประเด็นของตัวอย่างคือตัวแปรx
ถูกจับโดยการปิดที่กำหนดการcounter
ปิดและทุกครั้งที่x counter
การปิดใหม่is instantiated by the function, it gets its fresh own idea of what
คือ
อีกการใช้งานทั่วไปของการปิดคือความหมายของการใช้งานบางส่วนของฟังก์ชั่น สมมติว่าเรามีเครื่องมืออำนวยความสะดวกในการรายงานคล้ายกับsyslog
การใช้ฟังก์ชั่น
var log = function(priority, message) {
…
};
ที่ขัดแย้งpriority
และmessage
คาดว่าจะเป็นสตริงคนแรกเป็นหนึ่ง"debug"
, "info"
และอื่น ๆ เราสามารถกำหนดโรงงานบันทึกเช่นนี้:
var logWithPriority = function(priority) {
return function(message) {
log(priority, message);
};
};
และใช้มันเพื่อกำหนดสิ่งอำนวยความสะดวกสำหรับบันทึกรุ่นพิเศษของเรา:
var debug = logWithPriority("debug");
var info = logWithPriority("info");
…
สิ่งนี้มีประโยชน์มากเพราะแทนที่จะเขียนข้อผิดพลาดได้ง่าย - for
ลูปเช่นนี้
for(i = 0; i < journal.length; ++i) {
log("info", journal[i]);
}
เราสามารถเขียนทำความสะอาดที่สั้นและง่ายมาก (ไม่มีi
ที่มากดีกว่า):
journal.forEach(logWithPriority("info"));
แอปพลิเคชันที่สำคัญลำดับที่สามของการปิดคือการใช้การประเมินผลแบบขี้เกียจ - โปรดทราบว่าการสนับสนุนภาษาพิเศษสามารถให้การใช้งานที่ดีขึ้น
ฟังก์ชั่นขี้เกียจแทนที่จะทำการคำนวณแบบตรงจะคืนค่าการปิดซึ่งสามารถเรียกได้ว่า (หรือ“ ถูกบังคับ” ในช่วงเวลาแห่งความเกียจคร้าน) เพื่อทำคำถาม แรงจูงใจในการทำสิ่งนี้คือมันแยกการเตรียมการคำนวณและการคำนวณ ตัวอย่างที่ใช้งานได้จริงคือการคอมไพล์นิพจน์ทั่วไป: หากโปรแกรมรวบรวมนิพจน์ทั่วไปจำนวนมากเมื่อเวลาเริ่มต้นโปรแกรมจะต้องใช้เวลานานในการเริ่มต้น หากเรารวบรวมการแสดงออกปกติและบังคับพวกเขาอย่างเกียจคร้านตามที่เราต้องการดังนั้นโปรแกรมของเราสามารถเริ่มต้นได้อย่างรวดเร็ว แน่นอนว่านิพจน์ทั่วไปสามารถถูกแทนที่ที่นี่ด้วยโครงสร้างใด ๆ ที่ต้องการเวลาเริ่มต้นที่สำคัญ
นี่คือวิธีการใช้การประเมินผลแบบขี้เกียจกับการปิด พิจารณาการใช้คลาสสิกของฟังก์ชันarrayMax ที่คืนค่าสูงสุดในอาเรย์:
function arrayMax(array) {
return array.reduce(function(a, b) {
return Math.min(a, b);
};
}
ตัวแปรที่ขี้เกียจจะเป็น:
function arrayMax(array) {
var memo = null;
function actuallyCompute() {
if(memo === null) {
memo = array.reduce(function(a, b) {
return Math.min(a, b);
});
}
return memo;
}
return actuallyCompute;
}
ค่าส่งคืนคือการปิดซึ่งสามารถใช้ในการคำนวณค่าหรือดึงมันอีกครั้งถ้ามันได้รับการคำนวณแล้ว
ด้วยตัวอย่างทั้งสามนี้เราควรมั่นใจว่าการปิดและแอปพลิเคชันของพวกเขาเป็นแกนหลักของการเขียนโปรแกรมการทำงาน
การเรียนรู้การเขียนโปรแกรมฟังก์ชั่นหมายถึงการเรียนรู้วิธีการโปรแกรมด้วยการปิด ผลที่ตามมาคือภาษาที่อนุญาตให้มีการปิดการใช้งานที่ง่ายและโดยเฉพาะอย่างยิ่งการประยุกต์ใช้ฟังก์ชั่นบางส่วนนั้นควรได้รับการพิจารณาเมื่อมองหาภาษาเพื่อศึกษาการทำงานของโปรแกรม ในทางกลับกันภาษาที่การปิดไม่สามารถถูกจัดการได้ง่ายจะเป็นทางเลือกที่ไม่ดี
ฉันคิดว่าเครื่องมือที่คุณใช้มีอิทธิพลต่อการเรียนรู้ของคุณเป็นอย่างมาก แทบจะเป็นไปไม่ได้ที่จะเรียนรู้แนวคิดการเขียนโปรแกรมซึ่งภาษาการเขียนโปรแกรมที่คุณใช้ไม่ได้ให้ความหมายในการใช้ประโยชน์ แน่นอนคุณสามารถเรียนรู้บางสิ่งได้เสมอ แต่คุณไม่สามารถเรียนรู้ได้อย่างถูกต้อง
แต่ที่เป็นอยู่แล้วทางวิชาการเพราะเป็นมาตินกล่าวว่าในความคิดเห็นของเขาแม้ว่าคุณจะได้เรียนรู้การเขียนโปรแกรมการทำงานที่คุณควรจะได้พยายามที่จะทำเช่นนั้นเพราะมีภาษาที่นี้จะมากได้ง่ายขึ้น
คุณไม่ควรเรียนรู้การเขียนโปรแกรมฟังก์ชั่นใน C แต่เป็นภาษาที่ใช้งานได้อย่างเข้มงวด (Haskell, Caml, Erlang ฯลฯ .)
หากคุณยังใหม่กับการใช้งานคุณจะไม่ได้รับจริง ๆ ด้วยภาษาที่ใช้งานไม่ได้ มีโอกาสมากขึ้นที่คุณจะฝึกตัวเองให้ทำในสิ่งที่คุณคิดว่าเป็นฟังก์ชั่นการเขียนโปรแกรมและเรียนรู้สิ่งที่ผิด และมันยากกว่าที่จะ "เรียนรู้" ในสิ่งที่ถูกวิธีมากกว่าเรียนรู้วิธีที่ถูกต้องในตอนแรก
อย่างไรก็ตามฉันคิดว่าการทำงานใน C เป็นแบบฝึกหัดที่ดีสำหรับคนที่รู้จักการทำงาน เพราะบุคคลนั้นจะเรียนรู้สิ่งที่เกิดขึ้นหลังฮูด - คอมพิวเตอร์กำลังทำอะไรอยู่