คุณสมบัติการทำงาน
ไม่มีขอบเขตที่ชัดเจนของสิ่งที่กำหนดการเขียนโปรแกรมเชิงฟังก์ชันหรือไลบรารีการทำงาน คุณลักษณะบางอย่างของภาษาที่ใช้งานได้มีอยู่ใน Javascript:
- ฟังก์ชั่นชั้นหนึ่งลำดับที่สูงกว่า
- ฟังก์ชัน Lambdas / Anonymous พร้อมการปิด
คนอื่น ๆ สามารถทำได้ใน Javascript ด้วยความระมัดระวัง:
- ไม่เปลี่ยนรูป
- ความโปร่งใสในการอ้างอิง
ส่วนอื่น ๆ ยังคงเป็นส่วนหนึ่งของ ES6 และมีให้บริการบางส่วนหรือทั้งหมดในขณะนี้:
- ฟังก์ชั่นกะทัดรัดแม้จะสั้น
- การเรียกซ้ำของผู้ดำเนินการผ่านการเพิ่มประสิทธิภาพการโทรหาง
และยังมีสิ่งอื่น ๆ อีกมากมายที่เกินกว่า Javascript ปกติ:
- การจับคู่รูปแบบ
- ขี้เกียจประเมิน
- Homoiconicity
จากนั้นไลบรารีสามารถเลือกและเลือกประเภทของคุณลักษณะที่พยายามสนับสนุนและยังคงเรียกว่า "ใช้งานได้" ได้อย่างสมเหตุสมผล
ข้อกำหนดแฟนตาซีที่ดิน
แฟนตาซีที่ดินเป็นข้อกำหนดสำหรับจำนวนของชนิดมาตรฐานรังเพลิงจากหมวดหมู่คณิตศาสตร์ทฤษฎีและพีชคณิตนามธรรมในการเขียนโปรแกรมการทำงานประเภทเช่นหนังสือ , FunctorและMonad ประเภทเหล่านี้ค่อนข้างเป็นนามธรรมและอาจขยายความคิดที่คุ้นเคยมากขึ้น ตัวอย่างเช่น Functors เป็นคอนเทนเนอร์ที่สามารถmap
ข้ามไปมาได้ด้วยฟังก์ชันวิธีที่อาร์เรย์สามารถmap
ใช้งานArray.prototype.map
ได้
นิทานพื้นบ้าน
Folktaleคือชุดของประเภทที่ใช้ส่วนต่างๆของข้อกำหนด Fantasy-land และชุดฟังก์ชันยูทิลิตี้ที่ใช้ร่วมกันเล็กน้อย ประเภทเหล่านี้เป็นสิ่งที่ชอบบางที , ทั้ง , Task (คล้ายกับสิ่งที่เรียกว่าที่อื่น ๆ ในอนาคตและญาติถูกต้องตามกฎหมายมากขึ้นที่จะเป็นสัญญา) และการตรวจสอบ
นิทานพื้นบ้านอาจเป็นการนำข้อกำหนด Fantasy-land ที่รู้จักกันดีที่สุดมาใช้และเป็นที่ยอมรับนับถือ แต่ไม่มีสิ่งที่เรียกว่าการใช้งานขั้นสุดท้ายหรือเริ่มต้น ดินแดนแฟนตาซีระบุเฉพาะประเภทนามธรรมและการดำเนินการตามหลักสูตรจะต้องสร้างประเภทคอนกรีตดังกล่าว การอ้างสิทธิ์ของ Folktale ในการเป็นไลบรารีที่ใช้งานได้นั้นมีความชัดเจน: มีประเภทข้อมูลที่พบโดยทั่วไปในภาษาโปรแกรมที่ใช้งานได้ซึ่งทำให้โปรแกรมในลักษณะการทำงานง่ายขึ้นอย่างมาก
ตัวอย่างนี้จากเอกสารนิทานพื้นบ้าน ( หมายเหตุ : ไม่ได้อยู่ในเอกสารเวอร์ชันล่าสุด) แสดงให้เห็นถึงวิธีการใช้:
var Maybe = require('data.maybe')
function find(predicate, xs) {
return xs.reduce(function(result, x) {
return result.orElse(function() {
return predicate(x)? Maybe.Just(x)
: Maybe.Nothing()
})
}, Maybe.Nothing())
}
var numbers = [1, 2, 3, 4, 5]
var anyGreaterThan2 = find(function(a) { return a > 2 }, numbers)
var anyGreaterThan8 = find(function(a) { return a > 8 }, numbers)
รามดา
Ramda (ข้อจำกัดความรับผิดชอบ: ฉันเป็นหนึ่งในผู้เขียน) เป็นห้องสมุดประเภทที่แตกต่างกันมาก ไม่มีประเภทใหม่ให้คุณ 1 แต่มีฟังก์ชันเพื่อให้ใช้งานประเภทที่มีอยู่ได้ง่ายขึ้น มันถูกสร้างขึ้นจากแนวคิดของการเขียนฟังก์ชันที่เล็กลงให้เป็นฟังก์ชันที่ใหญ่ขึ้นการทำงานกับข้อมูลที่ไม่เปลี่ยนรูปเพื่อหลีกเลี่ยงผลข้างเคียง
Ramda ทำงานโดยเฉพาะอย่างยิ่งในรายการ แต่ยังอยู่ในวัตถุและบางครั้งใน Strings นอกจากนี้ยังมอบหมายการเรียกร้องจำนวนมากในลักษณะที่จะทำงานร่วมกับ Folktale หรือการใช้งาน Fantasy-land อื่น ๆ ยกตัวอย่างเช่น Ramda ของmap
ฟังก์ชั่นดำเนินการในทำนองเดียวกันกับหนึ่งบนดังนั้นArray.prototype
R.map(square, [1, 2, 3, 4]); //=> [1, 4, 9, 16]
แต่เนื่องจาก Folktale Maybe
ใช้ข้อกำหนด Fantasy-land Functor
ซึ่งระบุแผนที่ด้วยคุณจึงสามารถใช้ Ramda ได้map
ด้วย:
R.map(square, Maybe.Just(5));
R.map(square, Maybe.Nothing);
Ramda อ้างว่าเป็นไลบรารีที่ใช้งานได้จริงในการทำให้ง่ายต่อการเขียนฟังก์ชันไม่เปลี่ยนข้อมูลของคุณและนำเสนอเฉพาะฟังก์ชันที่บริสุทธิ์เท่านั้น การใช้ Ramda โดยทั่วไปคือการสร้างฟังก์ชันที่ซับซ้อนมากขึ้นโดยการจัดองค์ประกอบให้เล็กลงดังที่เห็นในบทความเกี่ยวกับปรัชญาของ Ramda
var userRatingForComments = R.pipe(
R.pluck('username')
R.map(R.propOf(users)),
R.pluck('rating'),
);
ห้องสมุดอื่น ๆ
อันที่จริงฉันพบห้องสมุดมากกว่านี้ดูเหมือนว่าทั้งหมดจะอยู่ในสองหมวดหมู่ ขีดล่าง lodash เหมือน Ramda มาก Fantasy-land, pointfree-fantasy เป็นเหมือนนิทานพื้นบ้าน
นั่นไม่ถูกต้องจริงๆ ประการแรก Fantasy-land เป็นเพียงข้อกำหนดที่ห้องสมุดสามารถตัดสินใจนำไปใช้กับประเภทต่างๆได้ นิทานพื้นบ้านเป็นหนึ่งในการปรับใช้ข้อกำหนดดังกล่าวอาจเป็นสิ่งที่ดีที่สุดและเป็นผู้ใหญ่ที่สุด Pointfree แฟนตาซีและramda แฟนตาซีคนอื่น ๆ และมีอื่น ๆ อีกมากมาย
ขีดล่างและlodashนั้นดูเผินๆเหมือน Ramda ตรงที่เป็นห้องสมุดแบบกระเป๋าถือซึ่งมีฟังก์ชั่นจำนวนมากโดยมีการทำงานร่วมกันน้อยกว่าของ Folktale และแม้แต่ฟังก์ชันการทำงานเฉพาะก็มักจะทับซ้อนกับ Ramda แต่ในระดับที่ลึกกว่านั้น Ramda มีข้อกังวลที่แตกต่างจากห้องสมุดเหล่านั้นมาก ญาติที่ใกล้เคียงที่สุดของ Ramda อาจจะเป็นห้องสมุดเช่นFKit , FnucและWu.js
Bilbyอยู่ในหมวดหมู่ของตัวเองโดยมีทั้งเครื่องมือมากมายเช่นเครื่องมือที่ Ramda จัดหาให้และบางประเภทก็สอดคล้องกับ Fantasy-land (ผู้แต่ง Bilby เป็นผู้แต่ง Fantasy-land เช่นกัน)
การโทรของคุณ
ไลบรารีทั้งหมดเหล่านี้มีสิทธิ์ถูกเรียกว่าฟังก์ชันแม้ว่าจะแตกต่างกันอย่างมากในแนวทางการทำงานและระดับความมุ่งมั่นในการทำงาน
ห้องสมุดเหล่านี้บางส่วนทำงานร่วมกันได้ดี Ramda ควรทำงานได้ดีกับ Folktale หรือการใช้งาน Fantasy-land อื่น ๆ เนื่องจากความกังวลของพวกเขาแทบจะไม่ทับซ้อนกันพวกเขาจึงไม่ขัดแย้งกัน แต่ Ramda ก็เพียงพอแล้วที่จะทำให้การทำงานร่วมกันเป็นไปอย่างราบรื่น นี่อาจเป็นความจริงน้อยกว่าสำหรับชุดค่าผสมอื่น ๆ ที่คุณสามารถเลือกได้ แต่ไวยากรณ์ของฟังก์ชันที่ง่ายกว่าของ ES6 อาจช่วยลดความเจ็บปวดจากการผสานรวมได้
การเลือกไลบรารีหรือแม้แต่รูปแบบของไลบรารีที่จะใช้นั้นขึ้นอยู่กับโปรเจ็กต์และความชอบของคุณ มีตัวเลือกที่ดีมากมายให้เลือกและตัวเลขก็เพิ่มขึ้นเรื่อย ๆ และหลายตัวเลือกที่ดีขึ้นอย่างมาก เป็นเวลาที่ดีที่จะเขียนโปรแกรมเชิงฟังก์ชันใน JS
1มีไซด์โปรเจ็กต์รามดาแฟนตาซีทำอะไรคล้าย ๆโฟล์กเทลแต่ไม่ได้เป็นส่วนหนึ่งของไลบรารีหลัก