Visual Studio Code での F# の概要

Ionide プラグインを使用した Visual Studio Code で F# を記述すると、IntelliSense とコード リファクタリングを使用して、優れた軽量のクロスプラットフォーム統合開発環境 (IDE) エクスペリエンスを実現できます。 プラグインの詳細については、Ionide.io に関するページを参照してください。

開始するには、F# と Ionide プラグインが正しくインストールされていることを確認します。

Ionide を使用して最初のプロジェクトを作成する

新しい F# プロジェクトを作成するには、コマンド ラインを開き、.NET CLI を使用して新しいプロジェクトを作成します。

dotnet new console -lang "F#" -o FirstIonideProject

完了したら、ディレクトリをプロジェクトに変更し、Visual Studio Code を開きます。

cd FirstIonideProject
code .

Visual Studio Code にプロジェクトが読み込まれると、開いているウィンドウの左側に F# のソリューション エクスプローラー ペインが表示されます。 これは、作成したプロジェクトが Ionide によって正常に読み込まれたことを意味します。 この時点より前にエディターでコードを記述できますが、これが発生すると、すべての読み込みが完了しています。

最初のスクリプトを作成する

.NET Core スクリプトを使用するように Visual Studio Code を構成したら、Visual Studio Code のエクスプローラー ビューに移動し、新しいファイルを作成します。 これに MyFirstScript.fsx という名前を付けます。

ここで、これに以下のコードを追加します。

let toPigLatin (word: string) =
    let isVowel (c: char) =
        match c with
        | 'a' | 'e' | 'i' |'o' |'u'
        | 'A' | 'E' | 'I' | 'O' | 'U' -> true
        |_ -> false
    
    if isVowel word[0] then
        word + "yay"
    else
        word[1..] + string(word[0]) + "ay"

この関数は、単語を Pig Latin の形式に変換します。 次の手順では、F# インタラクティブ (FSI) を使用してこれを評価します。

関数全体を強調表示します (長さは 11 行のはずです)。 強調表示されたら、Alt キーを押しながら Enter キーを押します。 画面の下部にターミナル ウィンドウが開き、次のように表示されることがわかります。

Ionide を使用した F# インタラクティブ出力の例

これにより、3 つの処理が行われました。

  1. FSI プロセスが開始されました。
  2. 強調表示したコードが FSI プロセスに送信されました。
  3. 送信したコードが FSI プロセスによって評価されました。

送信したのは関数だったので、FSI を使用してその関数を呼び出せるようになりました。 インタラクティブ ウィンドウで、次のように入力します。

toPigLatin "banana";;

次の結果が表示されます。

val it: string = "ananabay"

ここで、最初の文字として母音を試してみましょう。 次のように入力します。

toPigLatin "apple";;

次の結果が表示されます。

val it: string = "appleyay"

関数は想定どおりに動作しているようです。 これで、Visual Studio Code で最初の F# 関数を記述し、FSI を使用して評価しました。

注意

お気づきかもしれませんが、FSI の行は ;; で終了します。 これは、FSI を使用すると複数の行を入力できるためです。 末尾の ;; は、コードが終了したことを FSI に通知します。

コードの説明

コードによって実際に何が行われるかがわからない場合は、ここで順を追って説明します。

ご覧のように、toPigLatin は、単語を入力として受け取り、それを Pig-Latin 表現の単語に変換する関数です。 これには次のような規則があります。

単語の最初の文字が母音で始まる場合は、単語の末尾に "yay" を追加します。 母音で始まらない場合は、その最初の文字を単語の末尾に移動し、それに "ay" を追加します。

FSI に以下があることにお気づきかもしれません。

val toPigLatin: word: string -> string

これは、toPigLatin が、string を入力として受け取り (word と呼びます)、別の string を返す関数であることを示します。 これは関数の型シグネチャと呼ばれるもので、F# コードを理解するうえで重要な F# の基本部分です。 Visual Studio Code で関数をポイントしたときにもこれに気づくでしょう。

関数の本体には、次の 2 つの異なる部分があることがわかります。

  1. 特定の文字 (c) が、指定されたパターンのいずれかと一致するかどうかをパターン マッチングによってチェックすることにより、それが母音であるかどうかを判断する isVowel という内部関数。

    let isVowel (c: char) =
        match c with
        | 'a' | 'e' | 'i' |'o' |'u'
        | 'A' | 'E' | 'I' | 'O' | 'U' -> true
        |_ -> false
    
  2. 最初の文字が母音であるかどうかを確認し、最初の文字が母音であるかどうかに基づいて、入力文字から戻り値を構築する if..then..else 式。

    if isVowel word[0] then
        word + "yay"
    else
        word[1..] + string(word[0]) + "ay"
    

toPigLatin のフローは次のようになります。

入力単語の最初の文字が母音であるかどうかを確認します。 そうである場合は、単語の末尾に "yay" を付加します。 そうでない場合は、最初の文字を単語の末尾に移動し、それに "ay" を追加します。

これについて最後に注意すべき点が 1 つあります。F# では、関数から戻る明示的な命令がありません。 これは、F# が式ベースであり、関数の本体で評価された最後の式によってその関数の戻り値が決定されるためです。 if..then..else はそれ自体が式であるため、then ブロックの本体または else ブロックの本体の評価によって、toPigLatin 関数から返される値が決まります。

コンソール アプリを Pig Latin ジェネレーターにする

この記事のこれまでのセクションでは、F# コードを記述する場合の一般的な最初の手順を示しました。つまり、初期関数を記述し、FSI を使用してそれを対話形式で実行します。 これは REPL 駆動型の開発と呼ばれます。REPL は "Read-Evaluate-Print Loop" (読み取り-評価-出力のループ) を表します。 何かが動作するまで、機能を試してみることをお勧めします。

REPL 駆動型開発の次のステップは、動作するコードを F# 実装ファイルに移動することです。 その後、これを F# コンパイラでコンパイルして、実行可能なアセンブリにすることができます。

まず、.NET CLI で前に作成した Program.fs ファイルを開きます。 いくつかのコードが既に存在していることがわかります。

次に、PigLatin という新しい module を作成し、先ほど作成した toPigLatin 関数を次のようにコピーします。

module PigLatin =
    let toPigLatin (word: string) =
        let isVowel (c: char) =
            match c with
            | 'a' | 'e' | 'i' |'o' |'u'
            | 'A' | 'E' | 'I' | 'O' | 'U' -> true
            |_ -> false
        
        if isVowel word[0] then
            word + "yay"
        else
            word[1..] + string word[0] + "ay"

このモジュールは、main 関数の上、open System 宣言の下に配置する必要があります。 F# では宣言の順序が重要であるため、関数をファイル内で呼び出す前に定義する必要があります。

次に、main 関数で、引数に対して Pig Latin ジェネレーター関数を呼び出します。

[<EntryPoint>]
let main args =
    for arg in args do
        let newArg = PigLatin.toPigLatin arg
        printfn "%s in Pig Latin is: %s" arg newArg

    0

これで、コマンド ラインからコンソール アプリを実行できるようになりました。

dotnet run apple banana

スクリプト ファイルと同じ結果が、今回は実行中のプログラムとして出力されることがわかります。

Ionide のトラブルシューティング

発生する可能性がある特定の問題のトラブルシューティングを行う方法はいくつかあります。

  1. Ionide のコード編集機能を利用するには、F# ファイルを、ディスク上の、Visual Studio Code ワークスペースで開いているフォルダー内に保存する必要があります。
  2. システムに変更を加えた場合、または Visual Studio Code を開いた状態で Ionide の前提条件をインストールした場合は、Visual Studio Code を再起動します。
  3. プロジェクト ディレクトリに無効な文字が含まれていると、Ionide が機能しないおそれがあります。 この場合は、プロジェクト ディレクトリの名前を変更します。
  4. Ionide コマンドがいずれも動作していない場合は、Visual Studio Code キー バインドを調べて、誤って上書きしていないかどうかを確認します。
  5. Ionide がコンピューター上で破損していて、上記のいずれでも問題が解決されない場合は、コンピューター上の ionide-fsharp ディレクトリを削除し、プラグイン スイートを再インストールしてみてください。
  6. プロジェクトの読み込みに失敗した場合は (F# ソリューション エクスプローラーによって表示されます)、そのプロジェクトを右クリックし、 [See details](詳細の表示) をクリックして診断情報を取得します。

Ionide は、F# コミュニティのメンバーによって構築および管理されているオープン ソース プロジェクトです。 問題を報告し、ionide-vscode-fsharp GitHub リポジトリに自由に投稿してください。

Ionide Gitter チャネルで Ionide 開発者や F# コミュニティにさらに支援を求めることもできます。

次のステップ

F# とその言語の機能の詳細については、「F# のツアー」を参照してください。