F#の概要What is F#

F#は、適切で保守が容易なコードを簡単に記述できるようにする関数型プログラミング言語です。F# is a functional programming language that makes it easy to write correct and maintainable code.

F#プログラミングでは、主に、型が推論され、自動的に一般化される型と関数を定義する必要があります。F# programming primarily involves defining types and functions that are type-inferred and generalized automatically. これにより、プログラミングの詳細ではなく、問題のドメインにとどまり、そのデータを操作することができます。This allows your focus to remain on the problem domain and manipulating its data, rather than the details of programming.

open System // Gets access to functionality in System namespace.

// Defines a function that takes a name and produces a greeting.
let getGreeting name =
    sprintf "Hello, %s! Isn't F# great?" name

let main args =
    // Defines a list of names
    let names = [ "Don"; "Julia"; "Xi" ]

    // Prints a greeting for each name!
    |> List.map getGreeting
    |> List.iter (fun greeting -> printfn "%s" greeting)


F#には、次のようなさまざまな機能があります。F# has numerous features, including:

  • 簡易構文Lightweight syntax
  • 既定で変更不可Immutable by default
  • 型の推論と自動汎化Type inference and automatic generalization
  • ファーストクラス関数First-class functions
  • 強力なデータ型Powerful data types
  • パターン マッチングPattern matching
  • 非同期プログラミングAsync programming

機能の完全なセットについては、「 F#言語リファレンス」を参照してください。A full set of features are documented in the F# language reference.

豊富なデータ型Rich data types

レコード判別共用体などのデータ型を使用すると、複雑なデータとドメインを表すことができます。Data types such as Records and Discriminated Unions let you represent complex data and domains.

// 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# records and discriminated unions are non-null, immutable, and comparable by default, making them very easy to use.

関数とパターンマッチングでの強制的な正確性Enforced correctness with functions and pattern matching

F#関数は、実際には簡単に宣言でき、非常に強力です。F# functions are easy to declare and powerful in practice. パターンマッチングと組み合わせると、コンパイラによって正確性が強制される動作を定義できます。When combined with pattern matching, they allow you to define behavior whose correctness is enforced by the compiler.

// 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 %O" d
    | UndisclosedFailure -> printfn "Failed: unknown :("

F#関数もファーストクラスであり、パラメーターとして渡し、他の関数から返すことができます。F# functions are also first-class, meaning they can be passed as parameters and returned from other functions.

オブジェクトに対する操作を定義する関数Functions to define operations on objects

F#では、オブジェクトが完全にサポートされています。これは、データと機能をブレンドする必要がある場合に便利なデータ型です。F# has full support for objects, which are useful data types when you need to blend data and functionality. F#関数は、オブジェクトの操作に使用されます。F# functions are used to manipulate objects.

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#は、オブジェクト指向のコードを記述するのではなく、多くの場合、オブジェクトを操作する関数の別のデータ型として扱うコードを記述します。Rather than writing code that is object-oriented, in F#, you will often write code that treats objects as another data type for functions to manipulate. 汎用インターフェイスオブジェクト式メンバーの慎重な使用などの機能は、大規模F#なプログラムでよく見られます。Features such as generic interfaces, object expressions, and judicious use of members are common in larger F# programs.

次の手順Next steps

より大きなF#機能セットの詳細については、 F#ツアーをご覧ください。To learn more about a larger set of F# features, check out the F# Tour.