Skip to content

F# を使う理由

F#は科学や数値解析といった専門分野で優れていますが、企業向けの開発にも最適な選択肢です。 次回のプロジェクトではF#を使うべきだと思える理由を5つ紹介します。

簡潔性

F#には波かっこやセミコロンなどの、コーディング上の「ノイズ」がありません。

強力な型推論システムのおかげで、オブジェクトの型をほとんど指定する必要がありません。

また、C#と比べて、同じ問題を解決するのにより少ないコード行数で済みます。

// ワンライナー
[1..100] |> List.sum |> printfn "sum=%d"
// かっこも、セミコロンも、波かっこも不要
let square x = x * x
let sq = square 42
// 単純な型は1行で書ける
type Person = {First:string; Last:string}
// 複合的な型も数行で書ける
type Employee =
| Worker of Person
| Manager of Employee list
// 型推論
let jdoe = {First="John";Last="Doe"}
let worker = Worker jdoe

利便性

F#では多くの一般的なプログラミング作業がより簡単です。 これには、複雑な型定義の作成と使用、リスト処理比較と等価性状態機械などが含まれます。

また、関数が第一級オブジェクトであるため、他の関数をパラメータとして受け取る関数や、既存の関数を組み合わせて新しい関数を作る関数を作成することで、強力で再利用可能なコードを簡単に作れます。

// 自動的な等値判定と比較
type Person = {First:string; Last:string}
let person1 = {First="john"; Last="Doe"}
let person2 = {First="john"; Last="Doe"}
printfn "Equal? %A" (person1 = person2)
// "use" キーワードでIDisposableのロジックが簡単
use reader = new StreamReader(..)
// 関数の合成が簡単
let add2times3 = (+) 2 >> (*) 3
let result = add2times3 5

正確性

F#には強力な型システムがあり、null参照例外などの一般的なエラーを防ぎます。

値はデフォルトで不変なので、多くの種類のエラーを防げます。

さらに、型システムを使ってビジネスロジックを表現することで、 間違ったコードを書くことが不可能になったり、 単位の混乱を避けられたりするため、ユニットテストの必要性が大幅に減ります。

// 厳密な型チェック
printfn "print string %s" 123 //コンパイルエラー
// すべての値はデフォルトで不変
person1.First <- "new name" //割り当てエラー
// nullチェックは完全に不要
let makeNewString str =
//strは常に安全に追加可能
let newString = str + " new!"
newString
// ビジネスロジックを型に埋め込む
emptyShoppingCart.remove // コンパイルエラー!
// 測定単位
let distance = 10<m> + 10<ft> // エラー!

並行性

F#には、複数の処理を同時に行う際に役立つ組み込みライブラリがいくつかあります。 非同期プログラミングや並列処理がとても簡単にできます。

F#には組み込みのアクターモデルもあり、イベント処理や関数型リアクティブプログラミングのサポートも優れています。

そして、データ構造がデフォルトで不変なので、状態の共有やロックの回避がずっと簡単です。

// "async" キーワードで非同期ロジックが簡単
let! result = async {something}
// 並列処理が簡単
Async.Parallel [ for i in 0..40 ->
async { return fib(i) } ]
// メッセージキュー
MailboxProcessor.Start(fun inbox-> async{
let! msg = inbox.Receive()
printfn "message is: %s" msg
})

完全性

F#は基本的に関数型言語ですが、100% 純粋ではない他のスタイルもサポートしています。 これにより、Webサイト、データベース、他のアプリケーションなど、純粋でない世界とのやり取りがずっと簡単になります。

特に、F#は関数型とオブジェクト指向のハイブリッド言語として設計されているため、C#でできることはほぼすべてできます

F#は.NETエコシステムの一部ですから、すべてのサードパーティの.NETライブラリやツールにスムーズにアクセスできます。 (Monoや新しい .NET Coreを通じて)Linuxやスマートフォンなどのほとんどのプラットフォームで動作します。

さらに、Visual Studio(Windows用)やXamarin(Mac用)とよく統合されているため、IntelliSenseサポート、デバッガー、 ユニットテスト、ソース管理、その他の開発タスク用の多くのプラグインを備えた優れたIDEが使えます。 Linuxでは、代わりにMonoDevelop IDEを使用できます。

// 必要であれば非純粋なコードも書ける
let mutable counter = 0
// C#互換のクラスやインターフェースを作成できる
type IEnumerator<'a> =
abstract member Current : 'a
abstract MoveNext : unit -> bool
// 拡張メソッドが書ける
type System.Int32 with
member this.IsEven = this % 2 = 0
let i=20
if i.IsEven then printfn "'%i' is even" i
// UIコードが書ける
open System.Windows.Forms
let form = new Form(Width= 400, Height = 300,
Visible = true, Text = "Hello World")
form.TopMost <- true
form.Click.Add (fun args-> printfn "clicked!")
form.Show()

「F# を使う理由」シリーズ

以下のシリーズでは、F#単独のコードスニペット(しばしばC#コードとの比較も)を使って、F#のそれぞれの利点を紹介します。