BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース F# 4.1で実現する改善とC# 7との相互運用性

F# 4.1で実現する改善とC# 7との相互運用性

原文(投稿日:2017/01/23)へのリンク

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で提供されるソースコードに加えて,より多くの情報を提供するために言語仕様も公開される。

 
 

この記事を評価

関連性
スタイル
 
 

この記事に星をつける

おすすめ度
スタイル

BT