チュートリアル: 初めての F# プログラム
Visual Studio 2010 には、F# という新しいプログラミング言語が用意されています。 F# は、従来のオブジェクト指向プログラミングと .NET の概念に加えて、関数型プログラミングをサポートするマルチパラダイム言語です。 F# の機能と構文のいくつかを次の例で紹介します。 これらの例は、単純変数を宣言する方法、関数を記述してテストする方法、タプルとリストを作成する方法、およびクラスを定義して使用する方法について示します。
注意
次の手順で参照している Visual Studio ユーザー インターフェイス要素の一部は、お使いのコンピューターでは名前や場所が異なる場合があります。これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。詳細については、「Visual Studio での開発設定のカスタマイズ」を参照してください。
新しいコンソール アプリケーションを作成するには
[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
[テンプレート カテゴリ] ペインで、[Visual F#] が表示されていない場合は [他の言語] をクリックし、[Visual F#] をクリックします。 中央の [テンプレート] ペインに F# のテンプレートが一覧表示されます。
[テンプレート] ペインの最上部を見て、[ターゲット フレームワーク] ボックスに [.NET Framework 4] が表示されていることを確認します。
テンプレートの一覧の [F# アプリケーション] をクリックします。
[名前] フィールドにプロジェクトの名前を入力します。
[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] ウィンドウで結果を表示するには
前の手順で追加した let 式を選択します。
選択した領域を右クリックし、[Interactive に送信] をクリックします。 または、Alt キーを押しながら Enter キーを押します。
[F# Interactive] ウィンドウが開き、以下の行に示すように、let 式を解釈した結果が表示されます。 型は指定された値から推論されます。
val anInt : int = 5
val aString : string = "Hello"
val anIntSquared : int = 25
コマンド プロンプト ウィンドウで結果を確認するには
Program.fs に次の行を追加します。
System.Console.WriteLine(anInt) System.Console.WriteLine(aString) System.Console.WriteLine(anIntSquared)
Ctrl キーを押しながら F5 キーを押してコードを実行します。 コマンド プロンプト ウィンドウが表示され、次の値が示されます。
5
Hello
25
前の WriteLine ステートメントで、anInt、aString、および anIntSquared の各識別子の名前の上にマウス ポインターを置くと、推論された型を確認できます。
関数を定義して実行するには
次のコードに示すように、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)
Ctrl キーを押しながら F5 キーを押してコードを実行します。 25 という結果が表示されます。
再帰関数には let rec 式が必要です。 次の例では、n パラメーターの階乗を求める関数を定義します。
let rec factorial n = if n = 0 then 1 else n * factorial (n - 1) System.Console.WriteLine(factorial anInt)
Ctrl キーを押しながら F5 キーを押して関数を実行します。 結果として、5 の階乗である 120 が表示されます。
コレクションを作成するには: リストとタプル
値を集約する 1 つの方法は、次のコードに示すように、タプルを使用することです。
let turnChoices = ("right", "left") System.Console.WriteLine(turnChoices) // Output: (right, left) let intAndSquare = (anInt, square anInt) System.Console.WriteLine(intAndSquare) // Output: (5,25)
値を集約するもう 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"]
Ctrl キーを押しながら F5 キーを押すか、コードのセクションを選択し、Alt キーを押しながら Enter キーを押すことで、結果を表示できます。
クラスを作成して使用するには
次のコードでは、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 つの 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# チュートリアルの他の例を表示するには
[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
[テンプレート カテゴリ] ペインで、[Visual F#] が表示されていない場合は [他の言語] をクリックし、[Visual F#] をクリックします。 中央の [テンプレート] ペインに F# のテンプレートが一覧表示されます。
[テンプレート] ペインの最上部を見て、[ターゲット フレームワーク] ボックスに [.NET Framework 4] が表示されていることを確認します。
テンプレートの一覧の [F# チュートリアル] をクリックします。
[OK] をクリックします。
ソリューション エクスプローラーにチュートリアルが表示されます。
次の手順
関数型プログラミングとその他の例の詳細については、「ファースト クラスの値としての関数 (F#)」を参照してください。 タプル、リスト、let 式、関数定義、クラス、メンバー、およびその他の多数のトピックの詳細については、「F# 言語リファレンス」を参照してください。