ตลอดปีที่ผ่านมาฉันเขียนโค้ดScala (มาจากพื้นหลัง Java) ฉันชอบวิธีที่คุณสามารถสร้างรหัสที่ง่ายและสะอาดยิ่งขึ้นด้วย vals คลาส case, ฟังก์ชัน map / filter / lambda, implicits และการอนุมานประเภท ฉันใช้มันเป็นส่วนใหญ่สำหรับแอปพลิเคชันAkka
ปีนี้ฉันอยู่ในโปรเจค Scala กับทีมใหม่ที่ชอบการเขียนโปรแกรมที่ใช้งานได้จริง พวกเขาใช้Scalazอย่างหนักและรหัสจะถูกเติมเต็มทุกที่ด้วยผู้สมัครขอบเขตบริบทผู้อ่าน / นักเขียน / รัฐ monad แม้วิธีการหลักคือ "พัน" ใน I / O monad เหตุผลของพวกเขาคือสิ่งนี้ทำให้คอมไพเลอร์ "ทำงานเพื่อเรา" ในการยืนยันว่ารหัสถูกต้องและแต่ละฟังก์ชั่นเป็นอิสระจากผลข้างเคียง
ถึงกระนั้นจากมุมมองของฉันทุกไวยากรณ์นี้จริงๆได้รับในทางของตรรกะทางธุรกิจ ตัวอย่างเช่นประเภทของ "MyBusinessObject" นั้นใช้ได้เช่นเดียวกับประเภทเช่น "รายการ [MyBusinessObject]", "ตัวเลือก [MyBusinessObject]" หรือแม้แต่ "อนาคต [MyBusinessObject]" พวกเขาทั้งหมดมีความหมายและวัตถุประสงค์ที่ชัดเจน ในทางกลับกันโค้ดที่ต้องการ:
def method[M[_]: Applicative] = {
case (a, b) => (ca[M](a) |@| cb[M](b)) {
case t @ (ra, rb) =>
if (ra.result && rb.result) t.right
else t.left
}
}
มันเพิ่มความซับซ้อนให้กับโปรแกรมหรือเป็นเพียงฉันเท่านั้นที่ฉันไม่คุ้นเคยกับวิธีการเขียนโปรแกรมนี้
>>=
และ<$>
ซึ่งไม่มีความหมายอะไรจนกระทั่งคุณ รู้ว่าพวกเขาทำอะไร หลังจากเรียนรู้สิ่งที่พวกเขาหมายถึง แต่พวกเขาอ่านอย่างเป็นธรรมชาติและรวดเร็วสำหรับฉันตอนนี้ ไม่ใช่คำตอบจริงๆแค่ประสบการณ์วัตถุประสงค์ของฉันกับสิ่งนี้ ฉันใช้ Scala ด้วย แต่ไม่มีประสบการณ์กับห้องสมุด Scalaz
for(i=0; i<7; ++i) { trivialOperation(i); }
ด้วยtrivialOperationCount
ตัวแปรที่น่าอึดอัดใจไหม?) ตอนนี้ภาษาโปรแกรมการทำงานที่มีการจับคู่รูปแบบจะแนะนำตัวแปรเพิ่มเติม เพียงแค่เขียนการเรียกใช้เมธอด accessor ใน OO ผลลัพธ์โดยทั่วไปจะรัดกุมกว่า อาจอธิบายตัวเองน้อยลงเล็กน้อย แต่การค้นหาการประกาศข้อมูลตามปกติจะทำให้มันชัดเจนขึ้นอย่างรวดเร็ว การพิมพ์แบบสแตติกช่วยได้มากมันไม่เหมือนใน APL