F# は、簡潔で堅牢でパフォーマンスの高いコードを記述するためのユニバーサル プログラミング言語です。
F# を使用すると、プログラミングの詳細ではなく、問題のドメインに焦点を当てたまま、整然とした自己文書化コードを記述できます。
これは、速度と互換性を損なうことなく、オープンソース、クロスプラットフォーム、相互運用可能です。
open System // Gets access to functionality in System namespace.
// Defines a list of names
let names = [ "Peter"; "Julia"; "Xi" ]
// Defines a function that takes a name and produces a greeting.
let getGreeting name = $"Hello, {name}"
// Prints a greeting for each name!
names
|> List.map getGreeting
|> List.iter (fun greeting -> printfn $"{greeting}! Enjoy your F#")
F# には、次のような多くの機能があります。
- 軽量構文
- 既定では変更不可
- 型推論と自動一般化
- ファーストクラス関数
- 強力なデータ型
- パターン照合
- 非同期プログラミング
機能の完全なセットについては、 F# 言語ガイドを参照してください。
豊富なデータ型
レコードや判別共用体などの型を使用して、データを表現することができます。
// Group data with Records
type SuccessfulWithdrawal =
{ Amount: decimal
Balance: decimal }
type FailedWithdrawal =
{ Amount: decimal
Balance: decimal
IsOverdraft: bool }
// Use discriminated unions to represent data of 1 or more forms
type WithdrawalResult =
| Success of SuccessfulWithdrawal
| InsufficientFunds of FailedWithdrawal
| CardExpired of System.DateTime
| UndisclosedFailure
F# レコードと判別共用体は、null 以外で不変であり、既定では同等であるため、非常に使いやすくなっています。
関数とパターン マッチングの正確性
F# 関数は簡単に定義できます。 パターン マッチングと組み合わせると、コンパイラによって正確性が適用される動作を定義できます。
// Returns a WithdrawalResult
let withdrawMoney amount = // Implementation elided
let handleWithdrawal amount =
let w = withdrawMoney amount
// The F# compiler enforces accounting for each case!
match w with
| Success s -> printfn $"Successfully withdrew %f{s.Amount}"
| InsufficientFunds f -> printfn $"Failed: balance is %f{f.Balance}"
| CardExpired d -> printfn $"Failed: card expired on {d}"
| UndisclosedFailure -> printfn "Failed: unknown :("
F# 関数はファースト クラスでもあります。つまり、パラメーターとして渡して他の関数から返すことができます。
オブジェクトに対する操作を定義する関数
F# にはオブジェクトの完全なサポートがあり、データと機能をブレンドする必要がある場合に便利です。 F# のメンバーと関数は、オブジェクトを操作するために定義できます。
type Set<'T when 'T: comparison>(elements: seq<'T>) =
member s.IsEmpty = // Implementation elided
member s.Contains (value) =// Implementation elided
member s.Add (value) = // Implementation elided
// ...
// Further Implementation elided
// ...
interface IEnumerable<'T>
interface IReadOnlyCollection<'T>
module Set =
let isEmpty (set: Set<'T>) = set.IsEmpty
let contains element (set: Set<'T>) = set.Contains(element)
let add value (set: Set<'T>) = set.Add(value)
F# では、多くの場合、オブジェクトを操作する関数の型として扱うコードを記述します。 ジェネリック インターフェイス、オブジェクト式、メンバーの慎重な使用などの機能は、大規模な F# プログラムで一般的です。
次のステップ
より大きな F# 機能のセットの詳細については、 F# ツアーを参照してください。
.NET