Job F# vừa hiếm, vừa không có offer tốt ở HCM lẫn HN.
Dù học ngôn ngữ nào hay paradigm nào, cái mình nên học là ý tưởng để giải quyết vấn đề.
F# có vài điểm sáng nho nhỏ (về ý tưởng) mà C# đã học tập theo
- LINQ (C# 3)
- async/await (C# 5). Asynchronous programming trong F# ra mắt từ nửa cuối 2007[1]; C# 5 ra mắt khoảng cuối 2011 cùng với VS 2012 và .NET Fx 4.5.
- Pattern matching (C# 7, 8, 9)
- Tuple (C# 7)
- Record (C# 9)
Mình chỉ liệt kê số lượng, không so sánh chất lượng và những khác biệt. So sánh sẽ khập khiễng.
Ngược lại, F# được hưởng lợi rất nhiều do nó là một phần trong hệ sinh thái .NET.
Mình biết rất ít về Python, nhưng có lẽ mình phần nào đồng tình với nhận xét về hệ sinh thái.
Domain modeling là cốt lõi của nhiều nghiệp vụ. Về mặt này, F# có lợi thế hơn C#. F# có discriminated union (DU) và units of measure mà C# thì không[2][3][4]. Trong khi với F#, người ta dùng DU để mô hình hoá (modeling) các lựa chọn; thì với C#, người ta dùng những công cụ như enum, inheritance với base/derived classes. Đứng từ góc độ một domain expert (non-technical people), đọc code F# dễ hiểu và dễ verify hơn type hierarchy bên C#.
Nếu bạn cho rằng OOP (C# nói riêng) là phương pháp tuyệt vời để làm domain modeling, hãy gạt thiên kiến đó qua một bên[5] để xem cách người ta làm với một functional language ra sao[6][7][8][9].
[1]
Introducing F# Asynchronous Workflows (https://learn.microsoft.com/en-us/archive/blogs/dsyme/introducing-f-asynchronous-workflows)
[2]
Champion "Discriminated Unions" · Issue #113 · dotnet/csharplang (https://github.com/dotnet/csharplang/issues/113)
[3]
csharplang/proposals/discriminated-unions.md at main · dotnet/csharplang (https://github.com/dotnet/csharplang/blob/main/proposals/discriminated-unions.md)
[4]
GitHub - mcintyre321/OneOf: Easy to use F#-like ~discriminated~ unions for C# with exhaustive compile time matching (https://github.com/mcintyre321/OneOf)
[5]
Tách trà (https://trandinhhoanh.wordpress.com/2009/12/10/tach-tra/)
[6]
Low overhead type definitions | F# for fun and profit (https://fsharpforfunandprofit.com/posts/conciseness-type-definitions/)
[7]
The 'designing with types' series | F# for fun and profit (https://fsharpforfunandprofit.com/series/designing-with-types/)
[8]
Domain Driven Design | F# for fun and profit (https://fsharpforfunandprofit.com/ddd/)
[9]
Why type-first development matters (https://tomasp.net/blog/type-first-development.aspx/)