1 คะแนน โดย GN⁺ 2024-11-11 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • ทำไม F# 9 จึงสำคัญ: F# 9 ได้นำการปรับปรุงในวงกว้างที่ช่วยให้โปรแกรมปลอดภัยขึ้น ยืดหยุ่นขึ้น และมีประสิทธิภาพมากขึ้น

ชนิดอ้างอิงแบบ Nullable

  • F# ถูกออกแบบมาเพื่อหลีกเลี่ยง null แต่เมื่อทำงานร่วมกับไลบรารี .NET ที่เขียนด้วย C# ก็อาจมี null ปะปนเข้ามาได้
  • ตอนนี้ F# สามารถจัดการชนิดอ้างอิงที่มี null เป็นค่าที่ถูกต้องได้อย่างปลอดภัยทางชนิดข้อมูล
  • ตัวอย่าง:
    • let notAValue: string | null = null
    • let len (str: string | null) = match str with | null -> -1 | NonNull s -> s.Length

พร็อพเพอร์ตี .Is* ของ Discriminated Union

  • ตอนนี้ Discriminated Union มีพร็อพเพอร์ตีที่สร้างให้อัตโนมัติสำหรับแต่ละ case
  • ช่วยให้ตรวจสอบได้ว่าค่านั้นเป็น case ที่ระบุหรือไม่
  • ตัวอย่างเช่น สามารถเขียนเป็น person.contact.IsEmail ได้

partial active pattern สามารถคืนค่า bool แทน unit option ได้

  • ก่อนหน้านี้ partial active pattern จะคืนค่า Some () เมื่อตรงกัน และ None เมื่อไม่ตรงกัน
  • ตอนนี้สามารถคืนค่า bool ได้เช่นกัน

ให้ความสำคัญกับ extension method มากกว่าพร็อพเพอร์ตีในตัวเมื่อมีการส่งอาร์กิวเมนต์

  • ตอนนี้ F# สามารถ resolve extension method ที่ถูกกำหนดด้วยชื่อเดียวกับพร็อพเพอร์ตีในตัวของชนิดข้อมูลได้
  • สิ่งนี้สอดคล้องกับแพตเทิร์นที่พบได้ในไลบรารี .NET บางตัว

รองรับ Computation Expression ที่มีบอดีว่าง

  • ตอนนี้ F# รองรับ Computation Expression ที่ว่างเปล่า
  • ตัวอย่าง: let xs = seq { }
  • โดยจะเรียกเมธอด Zero ของ builder

คำสั่งแฮชรองรับอาร์กิวเมนต์ที่ไม่ใช่สตริง

  • ก่อนหน้านี้คำสั่งแฮชสำหรับคอมไพเลอร์ยอมรับเฉพาะอาร์กิวเมนต์แบบสตริงที่ส่งผ่านด้วยเครื่องหมายอัญประกาศ
  • ตอนนี้สามารถรับอาร์กิวเมนต์ได้ทุกชนิด
  • ตัวอย่าง: #nowarn 0070

ขยายคำสั่ง #help ใน fsi

  • ตอนนี้คำสั่ง #help ของ F# Interactive จะแสดงเอกสารของอ็อบเจ็กต์หรือฟังก์ชันที่ระบุ
  • สามารถส่งค่าได้โดยไม่ต้องใส่เครื่องหมายอัญประกาศ
  • ตัวอย่าง: #help List.map;;

รองรับคำนำหน้า FS ใน #nowarn เพื่อปิดคำเตือน

  • ก่อนหน้านี้หากเขียน #nowarn "FS0057" จะมีข้อความแจ้งว่าเป็นหมายเลขคำเตือนที่ไม่ถูกต้อง
  • ตอนนี้ระบบยอมรับหมายเลขคำเตือนที่มีคำนำหน้าด้วยแล้ว

เตือนเมื่อใช้แอตทริบิวต์ TailCall กับฟังก์ชันหรือค่าที่ bind ด้วย let ซึ่งไม่เป็น recursive

  • ตอนนี้ F# จะส่งคำเตือนเมื่อใช้แอตทริบิวต์ [<TailCall>] ในตำแหน่งที่ไม่ถูกต้อง
  • แม้จะไม่กระทบต่อโค้ด แต่ก็อาจทำให้ผู้อ่านสับสนได้

การใช้เป้าหมายของแอตทริบิวต์

  • ตอนนี้คอมไพเลอร์จะใช้ AttributeTargets อย่างถูกต้องกับค่า let, ฟังก์ชัน, การประกาศ union case, implicit constructor, struct และ class
  • สิ่งนี้ช่วยป้องกันบั๊ก เช่น การลืมเพิ่มอาร์กิวเมนต์ unit ให้กับการทดสอบ Xunit

อัปเดตไลบรารีมาตรฐาน

ฟังก์ชัน Random สำหรับคอลเลกชัน

  • มีการเพิ่มฟังก์ชันใหม่ในโมดูล List, Array, Seq สำหรับการสุ่มตัวอย่างและการสับเปลี่ยนลำดับ
  • เวอร์ชันที่ใช้ shared Random instance แบบ implicit และปลอดภัยต่อเธรด
  • เวอร์ชันที่รับ Random instance เป็นอาร์กิวเมนต์
  • เวอร์ชันที่รับฟังก์ชัน randomizer แบบกำหนดเอง
  • มีฟังก์ชัน Shuffle, Choice, Choices, Sample

คอนสตรัคเตอร์แบบไม่มีพารามิเตอร์ของ CustomOperationAttribute

  • ช่วยให้สร้าง custom operation สำหรับ Computation Expression builder ได้ง่ายขึ้น
  • ไม่จำเป็นต้องระบุชื่ออย่างชัดเจนอีกต่อไป (ในกรณีส่วนใหญ่ ชื่อจะตรงกับชื่อเมธอดอยู่แล้ว)

รองรับ collection expression ของ C# สำหรับ F# List และ Set

  • เมื่อใช้ F# List และ Set จาก C# ตอนนี้สามารถกำหนดค่าเริ่มต้นด้วย collection expression ได้
  • ตัวอย่าง: FSharpSet<int> mySet = [ 1, 2, 3 ];

เพิ่มประสิทธิภาพการทำงานของนักพัฒนา

การกู้คืนของ parser

  • มีการปรับปรุง parser recovery อย่างต่อเนื่อง
  • เครื่องมือต่าง ๆ จึงยังคงทำงานได้แม้ระหว่างการแก้ไขโค้ดที่อาจยังไม่ถูกต้องตามไวยากรณ์เสมอไป

การวินิจฉัย

  • F# 9 มีข้อความการวินิจฉัยใหม่หรือที่ได้รับการปรับปรุงจำนวนมาก
  • เช่น กรณี override method ที่กำกวม การใช้ abstract member หรือ union ที่มีฟิลด์ซ้ำกัน

การมองเห็นจริง

  • วิธีที่ F# สร้างแอสเซมบลีมีปัญหาที่ทำให้สมาชิก private ถูกเขียนเป็น internal ใน IL
  • ตอนนี้สามารถแก้พฤติกรรมนี้ได้ด้วยแฟล็กคอมไพเลอร์ --realsig+

การปรับปรุงประสิทธิภาพ

การตรวจสอบความเท่ากันที่ปรับแต่งแล้ว

  • ตอนนี้การตรวจสอบความเท่ากันทำงานได้เร็วขึ้นและใช้หน่วยความจำน้อยลง

การแชร์ฟิลด์ของ Discriminated Union แบบ struct

  • หากหลาย case ของ struct DU มีฟิลด์ที่มีชื่อและชนิดเดียวกัน ก็สามารถแชร์ตำแหน่งหน่วยความจำเดียวกันได้
  • สิ่งนี้ช่วยลดขนาดหน่วยความจำของ struct

การปรับแต่งช่วงจำนวนเต็ม

  • ตอนนี้คอมไพเลอร์สร้างโค้ดที่ได้รับการปรับแต่งสำหรับ expression start..finish และ start..step..finish ได้ในหลายกรณีมากขึ้น
  • ก่อนหน้านี้จะปรับแต่งเฉพาะเมื่อชนิดเป็น int/int32 และ step เป็นค่าคงที่ 1 หรือ -1 เท่านั้น
  • ตอนนี้รองรับการปรับแต่งกับจำนวนเต็มทุกชนิดและค่า step อื่น ๆ ด้วย

การปรับแต่ง for x in xs -> ... ใน List/Array Comprehension

  • มีการปรับแต่ง for x in xs -> ... ใน comprehension ของ List และ Array แล้ว
  • โดยเฉพาะใน Array ที่เร็วขึ้นได้สูงสุด 10 เท่า และลดขนาดการจัดสรรลงเหลือประมาณ 1/3 ถึง 1/4

การปรับปรุงเครื่องมือ

Live Buffer ใน Visual Studio

  • ก่อนหน้านี้เป็นฟีเจอร์แบบ opt-in แต่ตอนนี้เปิดใช้งานเป็นค่าเริ่มต้นแล้ว
  • ตอนนี้คอมไพเลอร์เบื้องหลังของ IDE ทำงานกับ live file buffer ได้
  • ไม่จำเป็นต้องบันทึกไฟล์ลงดิสก์เพื่อให้การเปลี่ยนแปลงมีผล

ตัววิเคราะห์และการแก้โค้ดเพื่อลบวงเล็บที่ไม่จำเป็น

  • บางครั้งมีการใช้วงเล็บเพิ่มเติมเพื่อความชัดเจน แต่บางครั้งก็เป็นเพียงสิ่งรบกวน
  • ตอนนี้ Visual Studio มี code fix สำหรับลบวงเล็บออก

รองรับ custom visualizer สำหรับ F# ใน Visual Studio

  • ตอนนี้ debugger visualizer ของ Visual Studio ทำงานกับโปรเจกต์ F# ได้แล้ว

แสดงคำแนะนำลายเซ็นกลาง pipeline

  • ก่อนหน้านี้จะไม่มี signature help หากฟังก์ชันที่อยู่กลาง pipeline ถูกนำไปใช้กับ curried parameter ที่ซับซ้อนแล้ว (เช่น lambda)
  • ตอนนี้จะแสดงคำแนะนำลายเซ็นสำหรับพารามิเตอร์ถัดไป

1 ความคิดเห็น

 
GN⁺ 2024-11-11
ความคิดเห็นจาก Hacker News
  • F# เป็นภาษาที่ชอบที่สุดนับตั้งแต่ได้รู้จักครั้งแรกสมัยเรียนมหาวิทยาลัย มีฟีเจอร์หลายอย่างที่ล้ำหน้า C# และแม้ C# ก็กำลังนำฟีเจอร์เหล่านี้มาใช้ แต่ก็มีความยากจากปัญหาความเข้ากันได้ F# ยังคงเป็นภาษาที่ยอดเยี่ยม ใช้งานร่วมกับ ecosystem ของ .NET ได้ และให้ประสิทธิภาพเทียบเท่า C# โดยมี boilerplate น้อยกว่า

  • F# เป็นหนึ่งในผลิตภัณฑ์ที่ดีที่สุดที่ Microsoft เคยออกมานับตั้งแต่ Excel และทำให้ .NET กลายเป็นแพลตฟอร์มที่สมเหตุสมผล

  • เคยลงทุนลงแรงอย่างมากกับโปรเจกต์ Phosphor ที่สร้างบน F# แต่สุดท้ายต้องเขียนใหม่ทั้งหมดด้วย Typescript และ Rust พยายามรักษา type safety ข้ามหลายเทคโนโลยีผ่านไลบรารี Fable แต่มีปัญหาเรื่องการทำงานร่วมกันระหว่างไลบรารีและการจัดการ dependency ที่ยาก เลยคิดว่า F# เหมาะเฉพาะกรณีที่ยังมีการแยก frontend/backend แบบดั้งเดิมเท่านั้น

    • ตอนนี้สิ่งที่น่าสนใจที่สุดในเทคโนโลยีที่ใช้ภายในคือไลบรารี Effect และ Moonbit โดย Moonbit ดูเหมือนเป็น F# เวอร์ชันสมัยใหม่ที่ไม่ผูกกับ MS/.NET และน่าจะเป็นภาษาที่เหมาะกับโลกที่มี AI เป็นศูนย์กลาง
  • ในวิชาวิทยาการเข้ารหัสที่สามารถเลือกภาษาใดก็ได้บน .NET งานที่เขียนด้วย F# อ่านง่ายกว่าของคนอื่นมาก แต่แทบ 100% ของงานด้าน data science ทำด้วย Python จึงไม่ได้ใช้ F# มากกว่านี้

  • คิดถึงการทำงานด้วย F# แต่ก็ยังติดตามอัปเดตอยู่เรื่อย ๆ เครื่องมือค่อนข้างดี แม้ชุมชนจะไม่ใหญ่มากและ Microsoft จะดูไม่ค่อยใส่ใจ ปัญหาใหญ่ที่สุดคือความแม่นยำของ test coverage โค้ด

  • เพิ่งลองใช้ F# เมื่อไม่นานมานี้ และในฐานะคนที่มาจาก Python ชอบที่มี REPL ให้ใช้ ช่วงหน้าหนาวอยากทำโปรเจกต์เว็บแบ็กเอนด์เล็ก ๆ เพื่อทำความรู้จักภาษาและ ecosystem ให้มากขึ้น ได้ยินเรื่องดี ๆ เกี่ยวกับ Oxpecker ในส่วนของ http

  • สงสัยเรื่องแนวทางการกำหนดเวอร์ชันของ F# มีการปรับปรุงด้านคุณภาพเยอะ แต่ดูเหมือนไม่ถึงขั้นต้องเปลี่ยนเวอร์ชันหลัก เลยสงสัยว่าเป็นเพราะต้องการให้เลขเวอร์ชันตรงกับ .NET9 หรือไม่

  • อยากรู้ว่าสถานะของ F# ในฐานะตัวแทน C# สำหรับสร้างแอป GUI บน Windows เป็นอย่างไร และมีบริษัทไหนใช้ F# เพื่อจุดประสงค์นี้บ้างหรือไม่

  • ไม่เคยลอง F# มาก่อน แต่เจอเว็บไซต์ที่ดูเป็นแหล่งข้อมูลที่ดี: fsharpforfunandprofit.com

  • อยากรู้ว่าสถานะของ F# บน Linux/MacOS เป็นอย่างไร เป็นภาษาเฉพาะ Windows หรือให้ความรู้สึกเหมือนเป็นภาษาที่รองรับอย่างสมบูรณ์ด้วยหรือไม่