F# とは

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# のツアー」をご覧ください。