- Vì sao F# 9 quan trọng: F# 9 giới thiệu một loạt cải tiến rộng khắp giúp chương trình an toàn hơn, linh hoạt hơn và có hiệu năng tốt hơn
Kiểu tham chiếu nullable
- F# được thiết kế để tránh
null, nhưng khi tương tác với các thư viện .NET được viết bằng C#, null có thể xuất hiện lẫn vào
- Giờ đây F# cho phép xử lý kiểu tham chiếu có
null là một giá trị hợp lệ theo cách an toàn về kiểu
- Ví dụ:
let notAValue: string | null = null
let len (str: string | null) = match str with | null -> -1 | NonNull s -> s.Length
Thuộc tính .Is* của Discriminated Union
- Discriminated Union giờ có các thuộc tính được tự động tạo cho từng case
- Nhờ đó có thể kiểm tra một giá trị có thuộc một case cụ thể hay không
- Ví dụ có thể viết như
person.contact.IsEmail
Mẫu chủ động một phần có thể trả về bool thay vì unit option
- Trước đây, mẫu chủ động một phần sẽ trả về
Some () nếu khớp, còn không thì None
- Giờ đây nó cũng có thể trả về bool
Ưu tiên phương thức mở rộng hơn thuộc tính tích hợp khi có đối số
- F# giờ giải quyết các phương thức mở rộng được định nghĩa với cùng tên như thuộc tính tích hợp của kiểu
- Điều này phù hợp với mẫu thường thấy trong một số thư viện .NET
Hỗ trợ Computation Expression với phần thân rỗng
- F# giờ hỗ trợ Computation Expression rỗng
- Ví dụ:
let xs = seq { }
- Khi đó sẽ gọi phương thức Zero của builder
Chỉ thị hash cho phép đối số không phải chuỗi
- Trước đây, các chỉ thị hash cho trình biên dịch chỉ cho phép đối số chuỗi được truyền trong dấu ngoặc kép
- Giờ đây chúng có thể nhận đối số của mọi kiểu
- Ví dụ:
#nowarn 0070
Mở rộng chỉ thị #help trong fsi
- Chỉ thị
#help của F# Interactive giờ hiển thị tài liệu cho đối tượng hoặc hàm được cung cấp
- Có thể truyền vào mà không cần dấu ngoặc kép
- Ví dụ:
#help List.map;;
#nowarn hỗ trợ tiền tố FS để tắt cảnh báo
- Trước đây, nếu viết
#nowarn "FS0057" thì sẽ hiện thông báo số cảnh báo không hợp lệ
- Giờ đây số cảnh báo vẫn được chấp nhận ngay cả khi có tiền tố
Cảnh báo khi dùng thuộc tính TailCall cho hàm không đệ quy hoặc giá trị được ràng buộc bằng let
- Giờ đây F# sẽ phát cảnh báo nếu thuộc tính
[<TailCall>] được dùng ở nơi không phù hợp
- Điều này không ảnh hưởng đến mã, nhưng có thể gây bối rối cho người đọc
Áp dụng đích thuộc tính
- Trình biên dịch giờ áp dụng đúng
AttributeTargets cho giá trị let, hàm, khai báo union case, constructor ngầm định, struct và class
- Điều này có thể ngăn các lỗi như quên thêm đối số unit vào bài kiểm thử Xunit
Cập nhật thư viện chuẩn
Hàm Random cho collection
- Các hàm mới cho lấy mẫu ngẫu nhiên và xáo trộn đã được thêm vào các module List, Array và Seq
- Có phiên bản dùng một thể hiện Random dùng chung, ngầm định và an toàn luồng
- Có phiên bản nhận một thể hiện Random làm đối số
- Có phiên bản nhận một hàm randomizer tùy chỉnh
- Bao gồm các hàm Shuffle, Choice, Choices và Sample
Constructor không tham số của CustomOperationAttribute
- Giúp việc tạo các phép toán tùy chỉnh cho builder của Computation Expression trở nên dễ hơn
- Không cần chỉ định tên một cách tường minh nữa (trong đa số trường hợp, tên trùng với tên phương thức)
Hỗ trợ biểu thức collection của C# cho F# List và Set
- Khi dùng F# List và Set từ C#, có thể khởi tạo chúng bằng biểu thức collection
- Ví dụ:
FSharpSet<int> mySet = [ 1, 2, 3 ];
Cải thiện năng suất cho lập trình viên
Phục hồi parser
- Đã có những cải tiến liên tục đối với khả năng phục hồi của parser
- Công cụ vẫn tiếp tục hoạt động ngay cả khi mã đang được chỉnh sửa và chưa luôn đúng cú pháp
Chẩn đoán
- F# 9 có nhiều thông báo chẩn đoán mới hoặc được cải thiện
- Chẳng hạn với phương thức override mơ hồ, khi dùng abstract member, hoặc union có các trường trùng lặp
Khả năng hiển thị thực tế
- Cách F# tạo assembly có vấn đề là các thành viên private lại được ghi thành internal trong IL
- Giờ đây có thể sửa hành vi này bằng cờ trình biên dịch
--realsig+
Cải thiện hiệu năng
Kiểm tra tương đương được tối ưu hóa
- Việc kiểm tra tương đương giờ nhanh hơn và giảm cấp phát bộ nhớ
Chia sẻ trường trong struct Discriminated Union
- Nếu nhiều case của một struct DU có các trường cùng tên và cùng kiểu, chúng có thể chia sẻ cùng một vị trí bộ nhớ
- Điều này giúp giảm dung lượng bộ nhớ của struct
Tối ưu hóa phạm vi số nguyên
- Trình biên dịch giờ tạo mã tối ưu cho nhiều trường hợp hơn của biểu thức
start..finish và start..step..finish
- Trước đây chỉ được tối ưu khi kiểu là int/int32 và bước là hằng số 1 hoặc -1
- Giờ đây mọi kiểu số nguyên và các giá trị bước khác cũng được tối ưu
Tối ưu hóa for x in xs -> ... trong List/Array Comprehension
for x in xs -> ... trong comprehension của List và Array đã được tối ưu
- Đặc biệt với Array, tốc độ có thể tăng tới 10 lần và lượng cấp phát giảm còn khoảng 1/3 đến 1/4
Cải thiện công cụ
Live Buffer trong Visual Studio
- Trước đây đây là tính năng opt-in, nhưng giờ đã được bật mặc định
- Trình biên dịch chạy nền của IDE giờ hoạt động với bộ đệm tệp trực tiếp
- Không cần lưu tệp xuống đĩa để áp dụng thay đổi
Trình phân tích và sửa mã để loại bỏ dấu ngoặc không cần thiết
- Dấu ngoặc bổ sung đôi khi được dùng để tăng độ rõ ràng, nhưng đôi lúc chỉ là nhiễu
- Giờ đây Visual Studio cung cấp sửa mã để loại bỏ dấu ngoặc
Hỗ trợ trình hỗ trợ trực quan hóa tùy chỉnh cho F# trong Visual Studio
- Trình trực quan hóa của debugger trong Visual Studio giờ hoạt động với các dự án F#
Hiển thị gợi ý chữ ký ở giữa pipeline
- Trước đây, khi một hàm ở giữa pipeline đã được áp dụng các tham số curry phức tạp như lambda, thì sẽ không có trợ giúp chữ ký
- Giờ đây gợi ý chữ ký cho tham số tiếp theo sẽ được hiển thị
1 bình luận
Ý kiến trên Hacker News
F# là ngôn ngữ tôi yêu thích nhất kể từ lần đầu tiếp xúc thời đại học. Nó có những tính năng đi trước C#, và dù C# cũng đang đưa các tính năng này vào, họ gặp khó khăn vì vấn đề tương thích. F# vẫn là một ngôn ngữ tuyệt vời, tương thích với hệ sinh thái .NET và có thể mang lại hiệu năng ngang C# với ít boilerplate hơn
F# là một trong những sản phẩm tốt nhất Microsoft từng phát hành kể từ Excel, và nó biến .NET thành một nền tảng hợp lý
Tôi đã đầu tư rất nhiều vào dự án Phosphor dựa trên F#, nhưng cuối cùng phải viết lại toàn bộ bằng Typescript và Rust. Tôi đã cố duy trì type safety giữa nhiều công nghệ khác nhau thông qua thư viện Fable, nhưng gặp vấn đề về khả năng tương tác giữa các thư viện và việc quản lý phụ thuộc rất khó khăn. Tôi nghĩ F# chỉ phù hợp khi có sự phân tách frontend/backend theo kiểu truyền thống
Trong một lớp mật mã học cho phép chọn ngôn ngữ dùng .NET, bài tập tôi viết bằng F# dễ đọc hơn của những người khác. Gần như 100% công việc data science đều làm bằng Python, nên tôi không có nhiều cơ hội dùng F# hơn
Tôi nhớ cảm giác làm việc với F#, nhưng vẫn đang tiếp tục theo dõi các bản cập nhật. Công cụ khá tốt bất chấp quy mô cộng đồng nhỏ và sự thờ ơ của Microsoft. Vấn đề lớn nhất là độ chính xác của test coverage trong mã
Gần đây tôi đã thử dùng F#, và với tư cách là người đến từ Python, tôi rất thích việc có thể dùng REPL. Mùa đông này tôi muốn làm một dự án web backend nhỏ để hiểu rõ hơn về ngôn ngữ và hệ sinh thái. Tôi đã nghe nhiều điều tốt đẹp về Oxpecker ở phần http
Tôi tò mò về cách F# quản lý phiên bản. Có nhiều cải thiện về chất lượng, nhưng có vẻ không cần thay đổi major version. Tôi tự hỏi liệu việc đồng bộ số phiên bản với .NET9 có phải là lý do không
Tôi muốn biết hiện trạng của F# như một lựa chọn thay thế C# để làm ứng dụng GUI trên Windows, và có công ty nào dùng F# cho mục đích này hay không
Tôi chưa từng thử F#, nhưng đã tìm thấy một trang có vẻ là tài nguyên tốt: fsharpforfunandprofit.com
Tôi tò mò về tình trạng của F# trên Linux/MacOS. Không biết nó có chỉ dành cho Windows hay cho cảm giác như một ngôn ngữ được hỗ trợ đầy đủ trên các nền tảng đó không