F#というプログラミング言語をご存知でしょうか。検索エンジンで検索窓に入力すると「F# vs C#」と出てくる例の言語です。

もしかするとF#という名前すら聞いたことがないという方もいるのではないでしょうか。

ちなみにF#のFはFunctional programming language(関数型プログラミング言語)・System F(多相ラムダ計算)が由来です。

本記事ではF#の概要について述べさせて頂きたいと思います。


F#とは

F#(F Sharp)は2005年にバージョン1.xが発表され、2010年以降に本格的に利用可能になったプログラミング言語です。

Visual Studio 2010以降・Visual Studio Codeなどで使用できます。

今やF#はWindowsだけでなくLinux・macOS・JavaScriptなどのマルチプラットフォームで動作可能です。

GitHub > fsharp/fsharp

F#はMITライセンスで公開されているオープンソースプロジェクトになります。

F#ソフトウェア財団・Microsoft・オープンソースコントリビューターによって開発されている言語です。


F#の特徴

F#には以下のような特徴があります。それぞれ順番に見ていきましょう。

  • 関数型言語
  • マルチパラダイム言語


関数型言語

有名な関数型言語にはScala・Haskell・R言語・Erlangなどがあります。

簡単に説明すると関数型言語は関数を定義し、複数組み合わせることでプログラムを構築していく言語です。

F#は中でも非純粋関数型言語であり、副作用がある関数も許容します。

これはF#がOCaml(オーキャメル)というプラグラミング言語をベースに開発されたことに由来するからに他なりません。

OCamlもML(Meta-Language・エムエル)というプログラミング言語の方言であり、MLは関数型言語の1つです。


マルチパラダイム言語

F#は複数のプログラミングパラダイムを含むマルチパラダイム言語で、以下のパラダイムに対応しています。

  • 関数型プログラミング
  • 手続き型プログラミング
  • オブジェクト指向プログラミング
  • 非同期プログラミング
  • 並列プログラミング

プログラミングパラダイムとはプログラミングにおける考え方や枠組みのようなものです。

つまりF#では作成するプログラムの目的に合わせて、適切なプログラミングパラダイムを採用できます。


F#でできること

F#で作れるシステムやアプリケーションは以下です。

  • Console アプリケーション
  • Windows デスクトップ アプリケーション
  • Web アプリケーション
  • ライブラリ

本項では特にWindows デスクトップ アプリケーションとWeb アプリケーションについて解説を行います。


Windows デスクトップ アプリケーション

F#からUIフレームワークWPF(Windows Presentation Foundation)を利用することが可能です。

C#やVisual BasicからWPFを用いたWindowsアプリを作成したことがある方も多いのではないでしょうか。

F#でもこれらと同様にデスクトップアプリを構築することができます。

軽量の業務用ツールやフリーソフトの作成にも活用できるでしょう。


Web アプリケーション

F#が採用された大規模なWebアプリケーションはJet.comです。

Amazon.comに対抗すべく作成されたECサイトで、F#製のマイクロサービスとして動作しています。

またF#製のマイクロWebフレームワークがGiraffe(ジラフ)です。ASP.NET Core上で動作します。

他にもSuave(サーブ)・Saturn(サタン)・Bolero(ボレロ)など、F#製のWebフレームワークは豊富です。


F#とC#の比較

この手の記事で必ず話題に上る内容ではないでしょうか。


コードの記述量・記述内容

F#はC#に比べてコードの記述量が少なく済みます。

このため可読性が高くなるとともに、コードが理解しやすくなるためバグが減少するでしょう。

特に非同期プログラミングのコードを比較した場合、F#の方がC#よりはるかに少ないコード量になります。

F#は書きやすさを重視した軽量構文と冗語構文とを備えており、柔軟に記述スタイルを変更することが可能です。

不要であれば軽量構文はON・OFFの切り替えができるようになっています。

またF#は基本的に型安全であり、変数はデフォルトで不変です。C#はデフォルトで可変になります。


向いている用途

F#はその型安全性から統計分析・機械学習・数学などのデータサイエンスの領域で活発に利用されている言語です。

F#製のオープンソースエコシステムや機械学習フレームワークが開発されています。

またF#の持つ非同期プログラミングの側面は、クラウドソリューションを効率的に開発するのに適しているといえるでしょう。

更にF#はクラスプラットフォームをカバーするため、Android・iOS向けのモバイルアプリケーションの開発にも採用できます。


F#のメリット・デメリット

F#の有するメリット・デメリットについて簡単に見ていきましょう。


F#のメリット

F#だけでなく他の関数型言語にも当てはまりますが、これらの言語を学ぶことで開発者のプログラミング技術は大幅に向上します。

強力な型推論システムや静的型付けによるコンパイル時のチェックは、エラーの防止や正しいコーディングを促すでしょう。

またF#はREPL (Read-Eval-Print Loop) をサポートしており、お試し実行やテストが簡単に実行できるようになっています。


F#のデメリット

F#は知名度の低さもさることながら、全体としての開発者人口もC#に比べれば非常に少ない状況です。

またモバイルアプリケーションが開発できるといっても、Windowsアプリケーション向けのサポート体制に比べると弱い面があるでしょう。


F#の基礎

本項ではF#について説明するために以下のサイトを利用します。

Try F#

このサイトはF#をクラウドIDE上で編集・実行できる優れものです。F#に興味を持った方は是非試してみて下さい。

ほんの一部ですがF#のコードを見てみましょう。


変数と関数の定義

以下のプログラムではint型の変数xと変数yを定義し、関数sampleFuncを用いて計算を行っています。

  1. let y = 4
  2. let sampleFunc x = x*x + y
  3. let x = 5
  4. let result = sampleFunc x
  5. printfn “%d*%d+%d=%d” x x y result

この処理の実行結果は文字列「5*5+4=29」になる筈です。明示的に「let sampleFunc (x:int) = x*x + y」と書くこともできます。


if・else文による条件分岐

if・else文を用いた処理は以下のように記述して下さい。

  1. let sampleFunc (value:int) =
  2.   if value % 2 = 1 then
  3.   printfn “%d-奇数” value
  4.   else
  5.  printfn “%d-偶数” value
  6. sampleFunc 5
  7. sampleFunc 6

 「5-奇数」「6-偶数」という文字列を改行した状態で出力される筈です。


printfnとWriteLineの違い

以下の2種類のコードはいずれも「Number: 100」という出力結果ですが、両者の間には微妙な違いがあるので説明します。

  1. let value = 100
  2. printfn “Number: %d” value
  3. System.Console.WriteLine(“Number: {0}” , value)

試しに「printfn “Number: %s” value」と書き換えて見て下さい。エラーメッセージが表示されてしまいます。

  1. This expression was expected to have type
  2.   ‘int’
  3. but here has type
  4.   ‘string’

printfnに指定した%sはstring型を、%dはint型をチェックしているためです。

「System.Console.WriteLine(“Number: %d” , value)」としてしまうと、「Number: %d」と出力されてしまいます。

混同しないように気を付けましょう。


F#の学習方法

C#などのオブジェクト指向型プログラミング言語を取り扱ってきた開発者にとって、F#の学習コストは比較的高めです。

一方、いずれかの関数型言語をマスターしたことがある人にとっては、多少ハードルが低いと思います。

本項では他言語からF#への入門を考えている方が、どのような方法で学習を進めたら良いかを解説しましょう。


ネット上のドキュメントを読む

F#ソフトウェア財団の「Learning F#」というページには、学習に有用なドキュメントや書籍へのリンクが記載されています。

The F# Software Foundation > Learning F#

Microsoftの開発ドキュメントは苦手という方もいるかもしれませんが、これだけ沢山のドキュメントがあればどれかは相性が合う筈です。

ちなみに「Community for F# Coding Dojos(F#コーディング道場)」という日本語にちなんだコミュニティがあったりします。

C#・Java・Python開発者向けのドキュメントや、C#経験者への短いチュートリアルなど、ターゲットを異にするドキュメントが豊富です。


英語の書籍を購入する

英語を読むのが苦にならないという方には英語のF#の書籍をおすすめします。

日本語の書籍もあるにはあるのですが、発行年が2010年前後と古いものが多いので厳しいかもしれません。

英語であれば比較的最近のメジャーバージョンについて書かれた書籍も見つけられます。

Stylish F#(Kit Eason 著)・Beginning F#(Robert Pickering 著)・Expert F# 4.0(Don Syme 著)などがおすすめでしょう。


F#がおすすめの理由

F#はシェアも低く流行りでもありませんが、開発者からは非常に愛されている言語だからです。


Stack Overflow Developer Survey Results(Stack Overflow 開発者調査結果)のランキングには常にF#の名前があります。


しかもLoved(愛された言語)については、ScalaやJavaよりも順位が上という結果です。


またTop Paying Technologies(給与が高い言語)では高順位を維持し続けています。

Stack Overflow Developer Survey 2019

Stack Overflow Developer Survey 2018

その理由は人工知能・機械学習・データ解析などの分野において、F#が一定の地位を獲得しているからでしょう。


F#の将来性

依然としてF#の知名度は低いものの、Windows周りの開発言語として注目を集めているのは確かです。

Visual Studio Codeの言語サポートも、一頃昔に比べると充実してきました。

日本国内のF#案件数はC#に比べればまだまだ少ない状況といわざるをえませんが、海外ではF#案件も一般的に存在しています。

これはF#コミュニティの活動についても同じで、海外では活発なものの日本ではあまり活発ではないのが現状です。

F#がいつ頃日本の開発現場に本格導入されるかは分かりません。

F#でできることはC#でできることも多く、C#で事足りているというのが実際のところです。


おわりに

本記事ではF#とは何か、メリット・デメリットにはどのようなことがあるのか、どのように学習したら良いのかについて説明しました。

またF#おすすめする理由や将来性についても紹介させて頂いたつもりです。

F#を直接仕事に繋げるのは難しいかもしれませんが、個人開発や補助的な業務ツールなどの自作には良い言語だと思います。