VisualStudio を使って Mac で F# の始め方(MSの資料の抄訳)

以下は,Microsoftのこちらのページ(Get started with F# in Visual Studio for Mac)の抄訳。原文は2017年2月13日版。

Visual Studio for Mac IDEは,F# および Visual F# をサポートしている。まずVisual Studio for Macをダウンロードする。この文書は,Visual Studio Community 2017 for Mac を使うことを前提にしている。

F#のインストール

Visual Studio for Mac のインストールでは,F# そのものは,初期設定のままでサポートされているので,特に何かをする必要はない。

コンソールアプリケーションの作成

Visual Studio for Mac で最も簡単なアプリケーションは,コンソールアプリケーションであるので,以下にその作成方法を示す:

  1. ファイルメニューからNew Solution を選択。
  2. New Project dialog が現れ,コンソールアプリケーション用には二種類のテンプレートが表示される。一つは,Other -> .NET にあり, .NET Framework である。もう一つは, .NET Core -> App にあり,こちらは .NET Core を想定している。この文書で書かれている内容に限っては,どちらを選んでもよい。console app を選ぶ際, C# から F# に切り替えてあるか,確認すること。
  3. プロジェクトに名前を設定し,必要なオプションを選択する。オプションの選択に応じて,プレビュー欄に表示されるディレクトリ(フォルダー)構造も変化する。
  4. Create をクリックして完了。F#プロジェクトがソリューションエクスプローラ内に表示される。

コードを書く

Program.fs という名前のファイルを開き,その中身を以下のように書き換えよう:

module HelloSquare

let square x = x * x

[<EntryPoint>]
let main argv =
    printfn "%d squared is: %d!" 12 (square 12)
    0 // Return an integer exit code

上記のコード例では, square 関数は x という引数を一つとり,それを自乗する関数として定義されている。F# は 型推論をするので,x の型を明示しなくともよい。F# コンパイラは,掛け算がどのような場合に有効であるかをわかっているので, square がどのような条件で呼び出されるかという情報を元に,x に適切な型を割り付けることができる。 square 関数名の上にマウスを動かすと,以下の情報が表示されるはずである。

val square: x:int -> int

これは,関数の型シグネチャである。意味するところは,「square は,整数型の引数 x をとり,整数型の結果を出力する関数」である。 square が int を出力すると特定されているのは,掛け算が特定のいくつかの型のみに有効な演算だとコンパイラがわかっているので,このことをもとに,この時点では int を選んでいる。だが,引数の型を別の型,例えば float に変えたとしたら,関数の型シグネチャも自動的に変わる。

別に,main 関数が定義されているが,これは EntryPoint 属性により,F#コンパイラはプログラムの開始位置をここからだと認識する。以下,コマンドライン引数がこの関数に渡され,返り値として(典型的には 0 なのだが,)整数値を出力するC言語タイプのプログラミング言語の作法に則った記述が続いている。

上記の例では,square 関数を呼び出すにあたって,引数に 12 をあてている。F#コンパイラは,これをもって square の型を,int -> int (つまり,この関数は int 型の引数を一つとり,int 型の返り値を出力する)としている。printfn は,フォーマット文字列を使用して,引数を埋め込んだ文字列と改行を出力する,C言語タイプのプログラミング言語ではおなじみの関数と同じ働きをする関数である。

コードを走らせる

メニューで表示されているRun の中の Start Without Debugging を選ぶと,プログラムが開始される。デバッグ機能は無効で,すぐに結果が表示されるはずだ。

Visual Studio for Mac が表示したコンソールウィンドウ内に,以下のように表示されただろうか:

12 squared is 144!

F# インタラクティブウィンドウを使う

F#インタラクティブウィンドウとは,コードを入力するとその場で結果が得られるコンソールウィンドウのことである。これを使うには,先程の square 関数の定義記述部分を選択し,メニューの Edit の中の Send selection to F# Interactive を選ぶ。これにより,選択したプログラムコードが F# インタラクティブウィンドウに送られる。別の方法としては,コード選択の後,右クリックで出てくる Send selection to F# Interactive を選ぶという方法もある。このように表示されるはずだ:

>
val square : x:int -> int
>

この表示は,先程見た square 関数の型シグネチャと同じ内容である。square 関数が F# インタラクティブプロセスの中であらためて定義されたので,以下のように別の値を引数として呼び出すことが可能となった:

> square 12;;
val it : int = 144
>square 13;;
val it : int = 169

上記の例では,関数が呼び出され,その結果が it に束縛され,it の型と内容が表示されている。各行を ;; で締めくくっているが,これは,F# インタラクティブ環境に対して関数呼び出しがここで終了していることを知らせている。F# インタラクティブ環境で新しい関数を定義することもできる:

> let isOdd x = x % 2 <> 0;;
val isOdd : x:int -> bool
> isOdd 12;;
val it : bool = false

上記の例では,新しい関数の isOdd を定義している。 int 型の引数を一つとり,奇数かどうかを判定する関数である。さまざまな引数で呼び出してみよう。関数の中で関数を呼び出すことも可能である:

> isOdd (square 15);;
val it : bool = true

パイプ演算子( pipe-forward operator )を使って,値を関数に流し込むこともできる:

> 15 |> square |> isOdd;;
val it : bool = true

パイプ演算子 ( The pipe-forward operator ) については後述する。インタラクティブ環境について,詳しくは Interactive Programming with F# を参照のこと。

次は...

F#言語の主要機能については,Tour of F# や F# Guide を参照のこと。