F# 4.6が.NET Core 2.2の最新リリースで利用可能になった。最も重要な変更は匿名レコード型の導入である。これはさまざまな状況においてレコード型を簡単に利用できるようにするものだ。 さらに、Visual Studio 2019のF# コンパイラーチェーンは、中~大規模プロジェクトのパフォーマンスがいくつかの面で向上した。
匿名レコード型を使うことで、開発者はあらかじめ名前を指定することなくアドホックにレコード型を宣言できる。これにより、次のコード片のような新しい可能性が開かれる。
let foo (args: {| a: Int; b: Int |}) =
a + b
foo {| a=2; b=4 |}
{| a = 1+1 |} = {| a = 2 |} // true
{| a = 1+1 |} = {| a = 2; b = 1|} // エラー、レコード型の不一致
構文上は構造的型付けが使えるかのように見えるが、匿名レコード型はF# に構造的型付けを導入するものではない。 その結果、2つの匿名レコード型は、フィールドがすべて同じラベル名・同じ型である場合にのみ、同じ型として認識される。 また、匿名レコード型はパターンマッチングをサポートしない。 ただ、匿名レコード型は、通常のレコードと同じようにシリアライズおよびデシリアライズすることができ、 struct {| ... |}
という構文を使えばスタックに割り当てることもできる。 特に気を付けなければならないのは、匿名レコード型と従来のレコード型には互換性がないことである。 したがって、匿名レコード型と同じ定義を持つ名前付きレコード型がある場合でも、それらを相互に入れ替えて使うことはできない。
Microsoft .NETおよび言語プログラムマネージャのPhilip Carterによると、コードのほとんどの場合においては、名前付きレコード型を使い続けることになるとのことである。 ただし、再帰的な直和型を定義する場合やLINQを使う場合など、開発者が匿名レコード型によってより簡潔なコードを得られるシナリオは多数ある。 より一般的には、匿名レコード型は構造を持つ一時データを使いやすくするものである。これは、データサイエンティストの典型的なユースケースだ。 InfoQでは、F# の匿名レコード型について、F# 4.6のプレビュー版で最初に利用可能になった際に既に記事にしている。 これらのケースのより完全な説明については、過去の記事を参照すること。
MicrosoftがF#のエコシステムを改善したもう1つの分野は、ツールのパフォーマンスである。 Visual Studio 2019用のF# ツールの最新リリースでは、中規模から大規模のソリューション、つまり50を超えるプロジェクトを含むソリューションのパフォーマンス改善に重点が置かれていた。 具体的には、新しいリリースではメモリーとCPUの両方の使用率が改善された。 これが可能になったのは、ラージオブジェクトヒープの割り当てが非効率的な場合を特定したためである。 Microsoftによれば、他にもキャッシュサイズの縮小、フォーマット文字列処理の改善、そしてF# の操作性を改善するためのいくつかの最適化が行われた。 残念ながら、Microsoftはこういった改善の効果をよりよく理解するための数値を発表していない。
最後に、F# コアライブラリの新機能について説明する。 新機能には、改良され、Option
型と同等となったValueOption
が含まれている。 また、List
, Array
, および Seq
でのtryExactlyOne
のサポートも含まれている。 この関数は、要素が見つからない場合に例外をスローするのではなくオプション型を返す。
F# 4.6を入手するには、Windowsを使っているのであればVisual Studio 2019をインストールしてもよいし、 あるいは、.NET Core 2.2をインストールして、Visual Studio for Mac、もしくはVisual Studio CodeとIonideを使ってもよい。