- F# 9が重要な理由: F# 9では、プログラムをより安全に、より堅牢に、より高性能にする幅広い改善が導入された
Nullable 参照型
- F# は null を避けるように設計されているが、C# で書かれた .NET ライブラリとやり取りする際には null が混入することがある
- これにより F# は、null を有効な値として持つ参照型を型安全な方法で扱えるようになった
- 例:
let notAValue: string | null = null
let len (str: string | null) = match str with | null -> -1 | NonNull s -> s.Length
Discriminated Union の .Is* プロパティ
- Discriminated Union は、各 case ごとに自動生成されたプロパティを持つようになった
- これにより、値が特定の case かどうかを確認できる
- たとえば
person.contact.IsEmail のように記述できる
部分アクティブパターンは unit option の代わりに bool を返せる
- 以前は部分アクティブパターンが一致すると
Some ()、そうでなければ None を返していた
- これからは bool を返すこともできる
引数が与えられている場合は組み込みプロパティより拡張メソッドを優先
- F# は、型の組み込みプロパティと同じ名前で定義された拡張メソッドを解決できるようになった
- これは一部の .NET ライブラリで見られるパターンと一致している
空の本体を持つ Computation Expression のサポート
- F# は空の Computation Expression をサポートするようになった
- 例:
let xs = seq { }
- ビルダーの Zero メソッドが呼び出される
ハッシュディレクティブは文字列以外の引数を許可
- コンパイラ向けのハッシュディレクティブは、以前は引用符付きの文字列引数しか受け付けなかった
- これからはすべての型の引数を取れる
- 例:
#nowarn 0070
fsi で #help ディレクティブを拡張
- F# Interactive の #help ディレクティブは、指定されたオブジェクトや関数のドキュメントを表示するようになった
- 引用符なしで渡せる
- 例:
#help List.map;;
警告の無効化のために #nowarn で FS 接頭辞をサポート
- 以前は
#nowarn "FS0057" と書くと、無効な警告番号というメッセージが表示されていた
- これからは接頭辞付きの警告番号も許可される
再帰でない関数や let で束縛された値に TailCall 属性を使った場合の警告
- F# は、[<TailCall>] 属性が不適切な場所で使われたときに警告を出すようになった
- コードには影響しないが、読む人を混乱させる可能性がある
属性ターゲットの適用
- コンパイラは、let 値、関数、union case 宣言、暗黙のコンストラクター、構造体、クラスに対して AttributeTargets を正しく適用するようになった
- これにより、Xunit テストに unit 引数を追加し忘れるといったバグを防げる可能性がある
標準ライブラリの更新
コレクション向けの Random 関数
- List、Array、Seq モジュールに、ランダムサンプリングとシャッフルのための新しい関数が追加された
- 暗黙的でスレッドセーフな共有 Random インスタンスを使うバージョン
- Random インスタンスを引数に取るバージョン
- カスタム randomizer 関数を受け取るバージョン
- Shuffle、Choice、Choices、Sample 関数がある
CustomOperationAttribute の引数なしコンストラクター
- Computation Expression ビルダー向けのカスタム操作をより簡単に作成できる
- 名前を明示的に指定する必要がない(多くの場合、名前はメソッド名と一致する)
F# List と Set に対する C# コレクション式のサポート
- F# List と Set を C# で使う際、コレクション式で初期化できる
- 例:
FSharpSet<int> mySet = [ 1, 2, 3 ];
開発者生産性の向上
パーサー回復
- パーサー回復には継続的な改善が加えられている
- コード編集中で常に構文的に正しくなくても、ツールが動作し続ける
診断
- F# 9 には新しい、または改善された診断メッセージが数多く含まれている
- あいまいな override メソッド、抽象メンバーの使用時、重複フィールドを持つ union など
実際の可視性
- F# でアセンブリを生成する方法には、private メンバーが IL では internal として書き出される問題がある
- これからは
--realsig+ コンパイラフラグでこの動作を修正できる
パフォーマンス改善
最適化された等値比較
- 等値比較がより高速になり、メモリ割り当ても減少した
構造体 Discriminated Union のフィールド共有
- 構造体 DU の複数の case が同じ名前と型のフィールドを持つ場合、同じメモリ位置を共有できる
- これにより構造体のメモリ使用量を削減できる
整数範囲の最適化
- コンパイラは、
start..finish と start..step..finish 式のより多くのケースで最適化されたコードを生成するようになった
- 以前は型が int/int32 で、ステップが定数 1 または -1 の場合にのみ最適化されていた
- これからはすべての整数型と、他のステップ値も最適化される
List/Array Comprehension の for x in xs -> ... 最適化
- List と Array の内包表記における
for x in xs -> ... が最適化された
- とくに Array では最大 10 倍の高速化と、割り当てサイズを 1/3 から 1/4 程度まで削減
ツール改善
Visual Studio の Live Buffer
- 以前はオプトイン機能だったが、これからはデフォルトで有効になった
- IDE のバックグラウンドコンパイラがライブファイルバッファーで動作するようになった
- 変更を反映するためにファイルをディスクへ保存する必要がない
不要なかっこを削除するためのアナライザーとコード修正
- 明確さのために追加のかっこが使われることもあるが、ときには単なるノイズになる
- Visual Studio でかっこを削除するコード修正が提供されるようになった
Visual Studio で F# 向けのカスタム可視化ヘルパーをサポート
- Visual Studio のデバッガー可視化ヘルパーが F# プロジェクトでも動作するようになった
パイプラインの途中でシグネチャツールチップを表示
- 以前は、パイプラインの途中にある関数に複雑なカリー化パラメーター(ラムダなど)がすでに適用されている場合、シグネチャヘルプは提供されなかった
- これからは次の引数に対するシグネチャツールチップが表示される
1件のコメント
Hacker Newsのコメント
F#は大学時代に初めて触れて以来、いちばん好きな言語です。C#より先行した機能を備えており、C#もそうした機能を取り入れていますが、互換性の問題で苦労しています。F#は今でも素晴らしい言語で、.NETエコシステムと互換性があり、少ないボイラープレートでC#と同等の性能を実現できます
F#は、MicrosoftがExcel以降に出した最高の製品の1つであり、.NETを理にかなったプラットフォームに変えました
F#ベースのPhosphorプロジェクトにかなり投資しましたが、最終的にはTypeScriptとRustで全面的に書き直すことになりました。Fableライブラリを通じてさまざまな技術間の型安全性を保とうとしましたが、ライブラリ間の相互運用性の問題と依存関係の管理が難しかったです。F#は、従来型のフロントエンド/バックエンドの分離がある場合にのみ適していると思います
.NETを使う言語を選べる暗号学の授業で、F#で書いた課題は他の人のものより読みやすかったです。データサイエンスの作業のほぼ100%がPythonで行われているので、F#をもっと使えないのが残念です
F#で作業していたのが恋しいですが、アップデートは追い続けています。ツールは、コミュニティの規模やMicrosoftの無関心にもかかわらず、かなり良かったです。最大の問題は、コードのテストカバレッジの正確さでした
最近F#を使ってみましたが、Pythonから来た身としてはREPLを使える点が気に入りました。冬に小さなWebバックエンドのプロジェクトを作って、この言語とエコシステムをもっとよく知りたいです。HTTP周りについてはOxpeckerの評判をよく聞きます
F#のバージョン管理のやり方が気になります。品質向上は多いものの、メジャーバージョン変更が必要には見えません。.NET 9とのバージョン番号合わせが理由なのでしょうか
F#がWindowsでGUIアプリを作るためのC#の代替としてどのような立ち位置にあるのか、またその目的でF#を使っている会社があるのか気になります
F#はやったことがありませんが、良いリソースに見えるサイトを見つけました: fsharpforfunandprofit.com
Linux/MacOSでのF#の状況が気になります。Windows専用なのか、それとも完全にサポートされた言語のように感じられるのか知りたいです