F# 4.5の話

気が付いたら nugetにFSharp.Core 4.5.0がリリースされていたので、4.5について雑多に書きなぐります。

Versioning

F# はこれまで 4.0から4.1へとマイナーバージョンをあげていました。 ところが今回はF# 4.5、間の3つをスキップしています。 スキップした理由は fslang-designで確認できます。

https://github.com/fsharp/fslang-design/blob/69c7c47931f8205c1cdf28d5819d675de734bd8e/tooling/FST-1004-versioning-plan.md

There will be no F# 4.2, F# 4.3, or F# 4.4 language version - it will skip to F# 4.5. This is because it will allow versions of the F# language, FSharp.Core, and FSharp.Core NuGet package to line up in a VS 15.7 timeframe.

(F# では言語、FSharp.Core(assembly)、FSharp.Core nugetパッケージという3つのバージョンを知っておく必要があります)

新機能

F# 4.5とFSharp.Core 4.5.0に追加された機能はRFCで詳細を確認できます。

言語: https://github.com/fsharp/fslang-design/tree/69c7c47931f8205c1cdf28d5819d675de734bd8e/FSharp-4.5

ライブラリ: https://github.com/fsharp/fslang-design/tree/69c7c47931f8205c1cdf28d5819d675de734bd8e/FSharp.Core-4.5.0.0

言語的な意味でのF# 4.5はVS 15.8を待つことになりますが、FSharp.Coreのほうは既に使えるので試してみると良いかと。

まぁ、それだけでこの記事終わりは味気ないのでかいつまんで紹介。

RFC FS-1037

https://github.com/fsharp/fslang-design/blob/master/FSharp-4.5/FS-1037-subsumption-for-union-constructors.md

かつてのバージョンでは判別共用体のコンストラクタとパイプライン演算子の組み合わせによってはコンパイルに失敗します(パイプラインを使わない場合は通る)が、4.5からは通るようになるという話。

RFC FS-1047

https://github.com/fsharp/fslang-design/blob/69c7c47931f8205c1cdf28d5819d675de734bd8e/FSharp-4.5/FS-1047-match-bang.md

コンピュテーション式にmatch!が追加されます。 コンパイル時にlet!matchに展開されるのでバイナリ互換は保たれるはず。

もちろんエディタやコンパイラはF# 4.5以降でないと認識できない。

RFC FS-1053

https://github.com/fsharp/fslang-design/blob/69c7c47931f8205c1cdf28d5819d675de734bd8e/FSharp-4.5/FS-1053-span.md

.NETの新機能としてSpanが追加されたので、F# でもサポート。 色々と型が追加されているけれど紹介が大変面倒なのでそのうち別記事を書きます。

RFC FS-1054

https://github.com/fsharp/fslang-design/blob/69c7c47931f8205c1cdf28d5819d675de734bd8e/FSharp-4.5/FS-1054-undent-list-args.md

リストや配列リテラルのインデントルールが緩和されるらしい。

"undentation" (i.e. relaxations to the indentation rules)

という造語(?)の説明を読み飛ばすとひどい目にあう。

RFC FS-1055

https://github.com/fsharp/fslang-design/blob/69c7c47931f8205c1cdf28d5819d675de734bd8e/FSharp-4.5/FS-1055-subsumption-for-yield-in-sequence-expression.md

リストや配列リテラルではyieldが使えるのですが、型によってはupcastを明示する必要がありました。 このupcastが不要になるよという話。

RFC FS-1057

https://github.com/fsharp/fslang-design/blob/69c7c47931f8205c1cdf28d5819d675de734bd8e/FSharp-4.5/FS-1058-make-enum-cases-public.md

F# におけるenum生成の変更。

RFC FS-1045

https://github.com/fsharp/fslang-design/blob/69c7c47931f8205c1cdf28d5819d675de734bd8e/FSharp.Core-4.5.0.0/FS-1045-func-to-fsharpfunc-overloads.md

Add new FuncConvert.FromFunc and FuncConvert.FromAction APIs.

RFC FS-1050

https://github.com/fsharp/fslang-design/blob/69c7c47931f8205c1cdf28d5819d675de734bd8e/FSharp.Core-4.5.0.0/FS-1050-trygetvalue-map.md

MapTryGetValueが追加されました。 値返却時にallocationが不要な分performance-friendlyらしい。

RFC FS-1039

https://github.com/fsharp/fslang-design/blob/69c7c47931f8205c1cdf28d5819d675de734bd8e/FSharp.Core-4.5.0.0/FS-1057-valueoption.md

sturctなoptionであるValueOption型と、voptionというtype aliasが追加されました。

FS-1058

https://github.com/fsharp/fslang-design/blob/69c7c47931f8205c1cdf28d5819d675de734bd8e/FSharp.Core-4.5.0.0/FS-1059-improve-async-stack-traces.md

asyncのstack traceが改善されたらしいです。 詳しくは上記リンクを読んでください。