- ทำไม 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 ความคิดเห็น
ความคิดเห็นจาก 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 แบบดั้งเดิมเท่านั้น
ในวิชาวิทยาการเข้ารหัสที่สามารถเลือกภาษาใดก็ได้บน .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 หรือให้ความรู้สึกเหมือนเป็นภาษาที่รองรับอย่างสมบูรณ์ด้วยหรือไม่