p_tan's blog

勉強日記です。ツッコミ大歓迎

なぜC#よりもF#なのか 2017 #fsharp

以前このような記事を書きました。

なぜC#よりもF#なのか - p_tan's blog

「F# C# 比較」とかでググると比較的上位に表示されるようで、毎日少しずつアクセスがあるようです。 さすがに6年前の記事で内容が古いので、現状での F# を見てみたいと思います。 なお、今でもまだC#はほぼ触っておらず、F#は自分ではあまり書いていなくて職場での導入支援を行っているだけなので、間違っていたら指摘をいただけると嬉しいです。

2011年からの変化

C#と比較したF#の利点と欠点

F#がC#よりも優れている点
  • より短く安全な記述が可能
    • デフォルトで値による等価性をもつレコード型
    • 型のグルーピングのための判別共用体
    • C#より簡単に関数を値として扱える。引数の部分適用も容易
    • パイプ演算子による流れるような処理の記述
    • 強力なパターンマッチ
      • 判別共用体、アクティブパターン
      • コンパイラによる分岐の考慮漏れや到達しないコードの警告
    • C#より高度な型推論での記述の省略
    • Option型での無効値の明示、基本的にNULLを用いない(NULLが無いわけでは無いが)
    • computation expressionでの言語内DSLの作成
    • オブジェクト式による無名オブジェクトの簡潔な記述
  • 単位を持った数値のサポート
    • メートルとか秒とかキログラムとかを数値に付けることができて、異なる単位同士の加算がコンパイルエラーになる等の静的検証ができる
  • 末尾再帰な関数をコンパイラが最適化してループ処理に変換してくれる

特に判別共用体は、ドメインモデリングを行う際に型をグループ化するための手段として有用だと思います。

C#ではなくF#を採用する際のリスク、不安な点と、それに対する反論
  • 学習コスト
    • 文法がC#とは大幅に違う
    • 関数型的な記述への慣れが必要
    • 反論 : 関数型的な設計、コーディングスタイルは現状普及しつつあり、学習コストを支払ってでも獲得しておくべきものである
  • 言語としての将来性
    • C#の進化によって、差別化ができなくなっていくのでは?
      • 以前はF#の利点だった非同期処理はasync-awaitで書きやすくなり、REPLもできた。パターンマッチも出来てくる。
    • 反論 :

参考サイト・参考文献