チュートリアル: 初めての F# プログラム

Visual Studio 2010 には、F# という新しいプログラミング言語が用意されています。 F# は、従来のオブジェクト指向プログラミングと .NET の概念に加えて、関数型プログラミングをサポートするマルチパラダイム言語です。 F# の機能と構文のいくつかを次の例で紹介します。 これらの例は、単純変数を宣言する方法、関数を記述してテストする方法、組とリストを作成する方法、およびクラスを定義して使用する方法について示します。

注意

お使いのマシンで、Visual Studio ユーザー インターフェイスの一部の要素の名前や場所が、次の手順とは異なる場合があります。 これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。 詳細については、「Visual Studio の設定」を参照してください。

新しいコンソール アプリケーションを作成するには

  1. [ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。

  2. [テンプレート カテゴリ] ペインで、[Visual F#] が表示されていない場合は [他の言語] をクリックし、[Visual F#] をクリックします。 中央の [テンプレート] ペインに F# のテンプレートが一覧表示されます。

  3. [テンプレート] ペインの最上部を見て、[ターゲット フレームワーク] ボックスに [.NET Framework 4] が表示されていることを確認します。

  4. テンプレートの一覧の [F# アプリケーション] をクリックします。

  5. [名前] フィールドにプロジェクトの名前を入力します。

  6. [OK] をクリックします。

    ソリューション エクスプローラーに新しいプロジェクトが表示されます。

let キーワードで識別子を宣言して使用するには

  • 次のコードをコピーし、Program.fs に貼り付けます。 anInt、aString、および anIntSquared の各識別子が値にバインドされます。

    let anInt = 5
    let aString = "Hello"
    // Perform a simple calculation and bind anIntSquared to the result.
    let anIntSquared = anInt * anInt
    

    注意

    クラシック ビューでコードを表示できない場合は、トピック タイトルの下にある見出しの [言語のフィルター] が F# を含むように設定されていることを確認してください。

[F# Interactive] ウィンドウで結果を表示するには

  1. 前の手順で追加した let 式を選択します。

  2. 選択した領域を右クリックし、[Interactive に送信] をクリックします。 または、Alt キーを押しながら Enter キーを押します。

  3. [F# Interactive] ウィンドウが開き、以下の行に示すように、let 式を解釈した結果が表示されます。 型は指定された値から推論されます。

    val anInt : int = 5

    val aString : string = "Hello"

    val anIntSquared : int = 25

コマンド プロンプト ウィンドウで結果を確認するには

  1. Program.fs に次の行を追加します。

    System.Console.WriteLine(anInt)
    System.Console.WriteLine(aString)
    System.Console.WriteLine(anIntSquared)
    
  2. Ctrl キーを押しながら F5 キーを押してコードを実行します。 コマンド プロンプト ウィンドウが表示され、次の値が示されます。

    5

    Hello

    25

    前の WriteLine ステートメントで、anInt、aString、および anIntSquared の各識別子の名前の上にマウス ポインターを置くと、推論された型を確認できます。

関数を定義して実行するには

  1. 次のコードに示すように、let 式を使用して 2 乗関数を定義します。 この関数は、n という 1 つのパラメーターを持ち、n に渡された引数の 2 乗を返します。

    let square n = n * n
    // Call the function to calculate the square of anInt, which has the value 5.
    let result = square anInt
    // Display the result.
    System.Console.WriteLine(result)
    
  2. Ctrl キーを押しながら F5 キーを押してコードを実行します。 25 という結果が表示されます。

  3. 再帰関数には let rec 式が必要です。 次の例では、n パラメーターの階乗を求める関数を定義します。

    let rec factorial n = 
        if n = 0 
        then 1 
        else n * factorial (n - 1)
    System.Console.WriteLine(factorial anInt)
    
  4. Ctrl キーを押しながら F5 キーを押して関数を実行します。 結果として、5 の階乗である 120 が表示されます。

コレクションを作成するには: リストと組

  1. 値を集約する 1 つの方法は、次のコードに示すように、組を使用することです。

    let turnChoices = ("right", "left")
    System.Console.WriteLine(turnChoices)
    // Output: (right, left)
    
    let intAndSquare = (anInt, square anInt)
    System.Console.WriteLine(intAndSquare)
    // Output: (5,25)
    
  2. 値を集約するもう 1 つの方法として、次のコードに示すように、リストを使用することもできます。

    // List of best friends.
    let bffs = [ "Susan"; "Kerry"; "Linda"; "Maria" ] 
    

    このリストに新しい親友を追加するには、"cons" 演算子 (::) を使用します。 この演算では、bffs の値は変更されないことに注意してください。 bffs の値は不変であるため、変更できません。

    // Bind newBffs to a new list that has "Katie" as its first element.
    let newBffs = "Katie" :: bffs
    

    リストを表示するには、printfn を使用します。 printfn 関数は、構造化された値に含まれている個々の要素を表示します。

    printfn "%A" bffs
    // Output: ["Susan"; "Kerry"; "Linda"; "Maria"]
    printfn "%A" newBffs
    // Output: ["Katie"; "Susan"; "Kerry"; "Linda"; "Maria"]
    
  3. Ctrl キーを押しながら F5 キーを押すか、コードのセクションを選択し、Alt キーを押しながら Enter キーを押すことで、結果を表示できます。

クラスを作成して使用するには

  1. 次のコードでは、2 つのプロパティ Name と Age を持つ Person クラスを作成します。 Name は読み取り専用プロパティです。 関数型プログラミングのほとんどの値と同様に、その値は変更できません。 F# では、必要に応じて変更可能な値も作成できますが、その場合は変更可能として明示的に定義する必要があります。 次のクラス定義において、Age の値は、変更可能なローカル変数 internalAge に格納されます。 internalAge の値は変更できます。

    // The declaration creates a constructor that takes two values, name and age.
    type Person(name:string, age:int) =
        // A Person object's age can be changed. The mutable keyword in the
        // declaration makes that possible.
        let mutable internalAge = age
    
        // Declare a second constructor that takes only one argument, a name.
        // This constructor calls the constructor that requires two arguments,
        // sending 0 as the value for age.
        new(name:string) = Person(name, 0)
    
        // A read-only property.
        member this.Name = name
        // A read/write property.
        member this.Age
            with get() = internalAge
            and set(value) = internalAge <- value
    
        // Instance methods.
        // Increment the person's age.
        member this.HasABirthday () = internalAge <- internalAge + 1
    
        // Check current age against some threshold.
        member this.IsOfAge targetAge = internalAge >= targetAge
    
        // Display the person's name and age.
        override this.ToString () = 
            "Name:  " + name + "\n" + "Age:   " + (string)internalAge
    
    
  2. このクラスをテストするには、次のコードに示すように、2 つの Person オブジェクトを宣言し、変更を加えて、結果を表示します。

    // The following let expressions are not part of the Person class. Make sure
    // they begin at the left margin.
    let person1 = Person("John", 43)
    let person2 = Person("Mary")
    
    // Send a new value for Mary's mutable property, Age.
    person2.Age <- 15
    // Add a year to John's age.
    person1.HasABirthday()
    
    // Display results.
    System.Console.WriteLine(person1.ToString())
    System.Console.WriteLine(person2.ToString())
    // Is Mary old enough to vote?
    System.Console.WriteLine(person2.IsOfAge(18))
    

    次のような行が表示されます。

    Name: John

    Age: 44

    Name: Mary

    Age: 15

    False

F# チュートリアルの他の例を表示するには

  1. [ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。

  2. [テンプレート カテゴリ] ペインで、[Visual F#] が表示されていない場合は [他の言語] をクリックし、[Visual F#] をクリックします。 中央の [テンプレート] ペインに F# のテンプレートが一覧表示されます。

  3. [テンプレート] ペインの最上部を見て、[ターゲット フレームワーク] ボックスに [.NET Framework 4] が表示されていることを確認します。

  4. テンプレートの一覧の [F# チュートリアル] をクリックします。

  5. [OK] をクリックします。

  6. ソリューション エクスプローラーにチュートリアルが表示されます。

次の手順

関数型プログラミングとその他の例の詳細については、「ファースト クラスの値としての関数 (F#)」を参照してください。 組、リスト、let 式、関数定義、クラス、メンバー、およびその他の多数のトピックの詳細については、「F# 言語リファレンス」を参照してください。

参照

概念

Visual F# 2010 の新機能

ファースト クラスの値としての関数 (F#)

その他の技術情報

Visual F#

F# 言語リファレンス