F# 4.1は言語の面で改善されている。Microsoft tools for F#として今年後半に提供される予定の今回のバージョンでは,タプルのサポート,C# 7との相互運用,参照によるリターンが可能になる。
タプルはF#の構文と型推論によって手軽に使用できるため,F#では一般的に使用される機能である。タプルは参照型でヒープにストアされるが,F# 4.1では新たに,スタックにストアされる構造体タプル(struct tuple)が使用可能になった。これにより,小さなタプルを大量に生成するようなシナリオにおいては,パフォーマンス上のメリットがある。
ValueTuple型をサポートするために,タプル型とタプル式,タプルパターンがstruct
キーワードを使ってアノテーションできるようになった。
// 構造体タプルを新規生成する
let origin = struct (0, 0)
// 構造体タプルを関数の引数として,新たな構造体タプルを生成する
let getPointFromOffset (point: struct (x, y)) (offset: struct (dx, dy)) =
struct (x + dx, y + dy)
// 構造体タプルのパターンマッチ
let doAMatch (input: struct (x, y)) =
match input with
| struct (0, 0) -> sprintf "The tuple is the origin!"
| struct (_, _) -> sprintf "The tuple is NOT the origin!"
C# 7との相互運用もstruct
キーワードを使用する。
// 値タプルを返すC#関数をコールする
let struct(word, value) = SomeService.SomeResult()
// 値タプルをパラメータとするC#関数をコールする
let result = SomeService.CreateResult(struct("hello", 12))
タプルに加えてレコード型と判別共用体(discriminated union)も,struct
アノテーションを使って値型として表現できる。
[<Struct>]
type Student = {
Id: int
Name: string
Age: int
GPA: double
Major: string
}
[<Struct>]
type Shape =
| Circle of radius: float
| Square of side: int
| Rectangle of sides: double*double
F# 4.1では参照(by-ref)による戻り値も可能になった。参照ローカルはすでにサポートされているが,参照による戻り値を生成ないし使用する方法は,これまではサポートされていなかった。
// 配列から返す
let f (x:int[]) = &x.[0]
// レコードから返す
[<Struct>]
type R = { mutable z : int }
let f (x:byref<R>) = &x.z
C#メソッドが返す参照値を使用することも可能だ。
public static ref int Find(int val, int[] vals)
{
for (int i = 0; i < vals.Length; i++)
{
if (vals[i] == val)
{
return ref numbers[i];
}
}
}
// ‘result’は’byref<int>’型
let result = SomeCSharpClass.Find(3, [| 1; 2; 3; 4; 5 |])
GitHubで提供されるソースコードに加えて,より多くの情報を提供するために言語仕様も公開される。
この記事を評価
- 編集者評
- 編集長アクション