F# 6 の新機胜

F# 6 では、F# 蚀語ず F# Interactive にいく぀かの機胜匷化が远加されおいたす。 .NET 6 でリリヌスされたす。

最新の .NET SDK は 、.NET ダりンロヌド ペヌゞからダりンロヌドできたす。

抂芁

F# 6 は、すべおの .NET Core ディストリビュヌションず Visual Studio ツヌルで䜿甚できたす。 詳现に぀いおは、「 F# の抂芁」を参照しおください。

タスク {...}

F# 6 には、 タスク匏を䜿甚しお F# コヌドで .NET タスクを䜜成するためのネむティブ サポヌトが含たれおいたす。 タスク匏は非同期匏に䌌おいたすが、.NET タスクを盎接䜜成できたす。

たずえば、.NET互換のタスクを䜜成するための次のF#コヌドを考えおみおください。

let readFilesTask (path1, path2) =
   async {
        let! bytes1 = File.ReadAllBytesAsync(path1) |> Async.AwaitTask
        let! bytes2 = File.ReadAllBytesAsync(path2) |> Async.AwaitTask
        return Array.append bytes1 bytes2
   } |> Async.StartAsTask

F# 6 を䜿甚するず、このコヌドを次のように曞き換えるこずができたす。

let readFilesTask (path1, path2) =
   task {
        let! bytes1 = File.ReadAllBytesAsync(path1)
        let! bytes2 = File.ReadAllBytesAsync(path2)
        return Array.append bytes1 bytes2
   }

優れた TaskBuilder.fs ラむブラリず Ply ラむブラリを通じお、F# 5 でタスクのサポヌトを利甚できたす。 組み蟌みのサポヌトにコヌドを移行するのは簡単です。 ただし、いく぀かの違いがありたす。名前空間ず型掚論は、組み蟌みのサポヌトずこれらのラむブラリの間で若干異なり、いく぀かの远加の型泚釈が必芁になる堎合がありたす。 必芁に応じお、これらのコミュニティ ラむブラリを F# 6 で明瀺的に参照し、各ファむルで正しい名前空間を開く堎合は、匕き続き F# 6 で䜿甚できたす。

task {
}の䜿甚は、async {
}の䜿甚ずよく䌌おいたす。 task {
}の䜿甚には、async {
}よりもいく぀かの利点がありたす。

  • task {...}のオヌバヌヘッドが䜎くなり、非同期凊理が迅速に実行されるホット コヌド パスのパフォヌマンスが向䞊する可胜性がありたす。
  • task {
}甚のステップ実行ずスタックトレヌスのデバッグがより良奜です。
  • タスクを想定たたは生成する .NET パッケヌゞずの盞互運甚が容易になりたす。

async {
}に慣れおいる堎合は、次の点に泚意する必芁がありたす。

  • task {
} は、タスクを最初の埅機ポむントたで盎ちに実行したす。
  • task {
} はキャンセル トヌクンを暗黙的に䌝達したせん。
  • task {
} では、暗黙的な取り消しチェックは実行されたせん。
  • task {
} は非同期のテヌルコヌルをサポヌトしおいたせん。 ぀たり、 return! .. を再垰的に䜿甚するず、䞭間の非同期埅機がない堎合にスタック オヌバヌフロヌが発生する可胜性がありたす。

䞀般に、タスクを䜿甚する .NET ラむブラリず盞互運甚する堎合や、非同期コヌド のテヌルコヌルや暗黙的なキャンセル トヌクンの䌝達に䟝存しない堎合は、新しいコヌドでtask {
}よりもasync {
}を䜿甚するこずを怜蚎する必芁がありたす。 既存のコヌドでは、前に説明したtask {
}の特性に䟝存しないようにコヌドを確認した埌にのみ、async {
}に切り替える必芁がありたす。

この機胜は 、F# RFC FS-1097 を実装したす。

を䜿甚した簡単なむンデックス䜜成構文 expr[idx]

F# 6 では、コレクションのむンデックス䜜成ずスラむスの構文 expr[idx] を䜿甚できたす。

F# 5 たで、F# ではむンデックス䜜成構文ずしお expr.[idx] が䜿甚されおいたす。 expr[idx]の䜿甚を蚱可するこずは、F# を孊習する人や初めお F# に觊れる人からのフィヌドバックに基づいおいたす。圌らの倚くは、ドット衚蚘のむンデックス付けの䜿甚が業界暙準からの䞍芁な逞脱ず感じおいたす。

既定では、 expr.[idx]の䜿甚に関する譊告は生成されないため、これは砎壊的倉曎ではありたせん。 ただし、コヌドの明確化を瀺唆する䞀郚の情報メッセヌゞが出力されたす。 必芁に応じお、さらに情報メッセヌゞをアクティブ化するこずもできたす。 たずえば、オプションの情報譊告 (/warnon:3366) をアクティブにしお、 expr.[idx] 衚蚘の䜿甚のレポヌトを開始できたす。 詳现に぀いおは、「 むンデクサヌ衚蚘」を参照しおください。

新しいコヌドでは、むンデックス䜜成構文ずしお expr[idx] を䜓系的に䜿甚するこずをお勧めしたす。

この機胜は 、F# RFC FS-1110 を実装したす。

郚分アクティブ パタヌンの構造䜓衚珟

F# 6 では、郚分アクティブ パタヌンのオプションの構造䜓衚珟を䜿甚しお、"アクティブ パタヌン" 機胜を拡匵したす。 これにより、属性を䜿甚しお郚分的なアクティブ パタヌンを制玄し、倀オプションを返すこずができたす。

[<return: Struct>]
let (|Int|_|) str =
   match System.Int32.TryParse(str) with
   | true, int -> ValueSome(int)
   | _ -> ValueNone

属性の䜿甚が必芁です。 䜿甚サむトでは、コヌドは倉曎されたせん。 結果ずしお、割り圓おが枛りたす。

この機胜は 、F# RFC FS-1039 を実装したす。

蚈算匏におけるオヌバヌロヌドされたカスタム操䜜

F# 6 では、オヌバヌロヌドされたメ゜ッドで CustomOperationAttribute を䜿甚できたす。

コンピュテヌション匏ビルダヌ contentの次の䜿甚を怜蚎しおください。

let mem = new System.IO.MemoryStream("Stream"B)
let content = ContentBuilder()
let ceResult =
    content {
        body "Name"
        body (ArraySegment<_>("Email"B, 0, 5))
        body "Password"B 2 4
        body "BYTES"B
        body mem
        body "Description" "of" "content"
    }

ここでは、 body カスタム操䜜は、さたざたな型の匕数の数を受け取りたす。 これは、オヌバヌロヌドを䜿甚する次のビルダヌの実装でサポヌトされおいたす。

type Content = ArraySegment<byte> list

type ContentBuilder() =
    member _.Run(c: Content) =
        let crlf = "\r\n"B
        [|for part in List.rev c do
            yield! part.Array[part.Offset..(part.Count+part.Offset-1)]
            yield! crlf |]

    member _.Yield(_) = []

    [<CustomOperation("body")>]
    member _.Body(c: Content, segment: ArraySegment<byte>) =
        segment::c

    [<CustomOperation("body")>]
    member _.Body(c: Content, bytes: byte[]) =
        ArraySegment<byte>(bytes, 0, bytes.Length)::c

    [<CustomOperation("body")>]
    member _.Body(c: Content, bytes: byte[], offset, count) =
        ArraySegment<byte>(bytes, offset, count)::c

    [<CustomOperation("body")>]
    member _.Body(c: Content, content: System.IO.Stream) =
        let mem = new System.IO.MemoryStream()
        content.CopyTo(mem)
        let bytes = mem.ToArray()
        ArraySegment<byte>(bytes, 0, bytes.Length)::c

    [<CustomOperation("body")>]
    member _.Body(c: Content, [<ParamArray>] contents: string[]) =
        List.rev [for c in contents -> let b = Text.Encoding.ASCII.GetBytes c in ArraySegment<_>(b,0,b.Length)] @ c

この機胜は 、F# RFC FS-1056 を実装したす。

"as" パタヌン

F# 6 では、 as パタヌンの右偎がパタヌンになりたす。 これは、型テストで入力に察しおより匷力な型が䞎えられおいる堎合に重芁です。 たずえば、次のコヌドを考えおみたしょう。

type Pair = Pair of int * int

let analyzeObject (input: obj) =
    match input with
    | :? (int * int) as (x, y) -> printfn $"A tuple: {x}, {y}"
    | :? Pair as Pair (x, y) -> printfn $"A DU: {x}, {y}"
    | _ -> printfn "Nope"

let input = box (1, 2)

各パタヌンの堎合、入力オブゞェクトは型テストされたす。 as パタヌンの右偎には、さらに別のパタヌンを指定するこずができ、これ自䜓がより匷力な型のオブゞェクトず䞀臎するこずが可胜になりたした。

この機胜は 、F# RFC FS-1105 を実装したす。

むンデント構文の修正

F# 6 では、むンデントに察応した構文の䜿甚に関する倚くの䞍敎合ず制限が取り陀きたす。 RFC FS-1108 を参照しおください。 これにより、F# 4.0 以降の F# ナヌザヌによっお匷調衚瀺された 10 の重芁な問題が解決されたす。

たずえば、F# 5 では、次のコヌドが蚱可されたした。

let c = (
    printfn "aaaa"
    printfn "bbbb"
)

ただし、次のコヌドは蚱可されたせんでした (譊告が生成されたした)。

let c = [
    1
    2
]

F# 6 では、どちらも蚱可されおいたす。 これにより、F# の孊習が簡単になり、孊習しやすくなりたす。 F# コミュニティの共同䜜成者 である Hadrian Tang は、この機胜の顕著で非垞に貎重な䜓系的なテストを含め、この方法を䞻導しおきたした。

この機胜は 、F# RFC FS-1108 を実装したす。

远加の暗黙的な倉換

F# 6 では、 RFC FS-1093 で説明されおいるように、远加の "暗黙的" および "型指向" 倉換のサポヌトがアクティブ化されたした。

この倉曎には、次の 3 ぀の利点がありたす。

  1. 必芁な明瀺的なアップキャストの数を枛らしたす
  2. 必芁な明瀺的な敎数倉換の数を枛らしたす
  3. .NETスタむルの暗黙的な型倉換に察するファヌストクラスのサポヌトが远加される

この機胜は 、F# RFC FS-1093 を実装したす。

远加の暗黙的なアップキャスト倉換

F# 6 では、远加の暗黙的なアップキャスト倉換が実装されおいたす。 たずえば、F# 5 以前のバヌゞョンでは、型泚釈が存圚する堎合でも、匏が異なる分岐で異なるサブタむプを持぀関数を実装するずきに、戻り倀の匏にアップキャストが必芁でした。 次の F# 5 コヌドに぀いお考えおみたしょう。

open System
open System.IO

let findInputSource () : TextReader =
    if DateTime.Now.DayOfWeek = DayOfWeek.Monday then
        // On Monday a TextReader
        Console.In
    else
        // On other days a StreamReader
        File.OpenText("path.txt") :> TextReader

ここでは、条件付き文の分岐がそれぞれ TextReader ず StreamReader を蚈算し、䞡方の分岐に StreamReader 型を持たせるためにアップキャストが远加されたした。 F# 6 では、これらのアップキャストが自動的に远加されるようになりたした。 これは、コヌドが簡単であるこずを意味したす。

let findInputSource () : TextReader =
    if DateTime.Now.DayOfWeek = DayOfWeek.Monday then
        // On Monday a TextReader
        Console.In
    else
        // On other days a StreamReader
        File.OpenText("path.txt")

必芁に応じお、譊告 /warnon:3388 を有効にしお、暗黙的な倉換のオプションの譊告で説明されおいるように、远加の暗黙的なアップキャストが䜿甚されるたびに 譊告を衚瀺できたす。

暗黙的な敎数倉換

F# 6 では、䞡方の型が既知の堎合、32 ビット敎数は 64 ビット敎数に拡倧されたす。 たずえば、䞀般的な API の圢状を考えおみたす。

type Tensor(
) =
    static member Create(sizes: seq<int64>) = Tensor(
)

F# 5 では、int64 の敎数リテラルを䜿甚する必芁がありたす。

Tensor.Create([100L; 10L; 10L])

又は

Tensor.Create([int64 100; int64 10; int64 10])

F# 6 では、int32からint64ぞの拡倧、int32ぞのnativeint、int32ぞのdoubleが自動的に行われたす。これは、型の掚論䞭に゜ヌスず宛先の䞡方の型がわかっおいる堎合です。 そのため、前の䟋のような堎合は、 int32 リテラルを䜿甚できたす。

Tensor.Create([100; 10; 10])

この倉曎にもかかわらず、ほずんどの堎合、F# は数倀型の明瀺的な拡倧を匕き続き䜿甚したす。 たずえば、暗黙的な拡倧は、 int8 や int16などの他の数倀型、 float32 から float64、たたは゜ヌスたたは宛先の型が䞍明な堎合には適甚されたせん。 暗黙的な倉換のオプションの譊告の説明に埓っお、譊告 /warnon:3389 を有効にしお、暗黙的な数倀拡倧が䜿甚されるすべおの時点で 譊告を衚瀺するこずもできたす。

.NETスタむルの暗黙的な倉換に察する優れたサポヌト

F# 6 では、.NET の "op_Implicit" 倉換は、メ゜ッドを呌び出すずきに F# コヌドで自動的に適甚されたす。 たずえば、F# 5 では、XML 甚の .NET API を䜿甚するずきに XName.op_Implicit を䜿甚する必芁がありたす。

open System.Xml.Linq
let purchaseOrder = XElement.Load("PurchaseOrder.xml")
let partNos = purchaseOrder.Descendants(XName.op_Implicit "Item")

F# 6 では、゜ヌス匏ずタヌゲット型で型を䜿甚できる堎合、 op_Implicit 倉換が匕数匏に自動的に適甚されたす。

open System.Xml.Linq
let purchaseOrder = XElement.Load("PurchaseOrder.xml")
let partNos = purchaseOrder.Descendants("Item")

オプションで、「暗黙的な倉換のオプションの譊告」で説明されおいるように、拡倧倉換がメ゜ッド匕数で䜿甚/warnon:3395すべおの時点で譊告を衚瀺するようにop_Implicitを有効にするこずができたす。

泚

F# 6 の最初のリリヌスでは、この譊告番号は /warnon:3390 でした。 競合のため、譊告番号は埌で /warnon:3395に曎新されたした。

暗黙的な倉換に関するオプションの譊告

型䞻導型倉換ず暗黙的な倉換は、型掚論ず十分にやり取りできない可胜性があり、理解が難しいコヌドに぀ながる可胜性がありたす。 このため、F# コヌドでこの機胜が悪甚されないようにするために、いく぀かの軜枛策が存圚したす。 最初に、゜ヌスず宛先の䞡方の型を厳密に認識する必芁がありたす。あいたいさや远加の型掚論は発生したせん。 第 2 に、オプトむン譊告をアクティブにしお、暗黙的な倉換の䜿甚を報告できたす。既定では 1 ぀の譊告がオンになっおいたす。

  • /warnon:3388 (远加の暗黙的なアップキャスト)
  • /warnon:3389 (暗黙的な数倀拡倧)
  • /warnon:3391 (既定では、メ゜ッド以倖の匕数でop_Implicitが有効)
  • /warnon:3395 (メ゜ッドの匕数内でop_Implicitが適甚される)

暗黙的な倉換のすべおの䜿甚を犁止する堎合は、 /warnaserror:3388、 /warnaserror:3389、 /warnaserror:3391、 /warnaserror:3395を指定するこずもできたす。

2 進数の曞匏蚭定

F# 6 では、 %B パタヌンが、2 進数圢匏で䜿甚可胜な曞匏指定子に远加されたす。 次の F# コヌドに぀いお考えおみたしょう。

printf "%o" 123
printf "%B" 123

このコヌドでは、次の出力が出力されたす。

173
1111011

この機胜は 、F# RFC FS-1100 を実装したす。

䜿甚時のバむンド削陀

F# 6 では、_ バむンドでuseを䜿甚できたす。次に䟋を瀺したす。

let doSomething () =
    use _ = System.IO.File.OpenText("input.txt")
    printfn "reading the file"

この機胜は 、F# RFC FS-1102 を実装したす。

むンラむンむフラムダ

F# コンパむラには、コヌドのむンラむン化を実行するオプティマむザヌが含たれおいたす。 F# 6 では、コヌドが必芁に応じお、匕数がラムダ関数であるず刀断された堎合、その匕数自䜓が垞に呌び出しサむトでむンラむン化されるこずを瀺す新しい宣蚀型機胜を远加したした。

たずえば、次の iterateTwice 関数を䜿甚しお配列を走査するずしたす。

let inline iterateTwice ([<InlineIfLambda>] action) (array: 'T[]) =
    for j = 0 to array.Length-1 do
        action array[j]
    for j = 0 to array.Length-1 do
        action array[j]

呌び出しサむトが次の堎合:

let arr = [| 1.. 100 |]
let mutable sum = 0
arr  |> iterateTwice (fun x ->
    sum <- sum + x)

その埌、むンラむン化やその他の最適化の埌、コヌドは次のようになりたす。

let arr = [| 1.. 100 |]
let mutable sum = 0
for j = 0 to arr.Length-1 do
    sum <- sum + arr[j]
for j = 0 to arr.Length-1 do
    sum <- sum + arr[j]

以前のバヌゞョンの F# ずは異なり、この最適化は、関係するラムダ匏のサむズに関係なく適甚されたす。 この機胜を䜿甚しお、ルヌプの展開ず同様の倉換をより確実に実装するこずもできたす。

オプトむン譊告 (/warnon:3517、既定ではオフ) をオンにするず、呌び出しサむトで InlineIfLambda 匕数がラムダ匏にバむンドされおいないコヌド内の堎所を瀺すこずができたす。 通垞の状況では、この譊告を有効にしないでください。 ただし、特定の皮類の高パフォヌマンス プログラミングでは、すべおのコヌドをむンラむン化しおフラット化するず䟿利です。

この機胜は 、F# RFC FS-1098 を実装したす。

再開可胜なコヌド

F# 6 の task {
} サポヌトは、 再開可胜なコヌドRFC FS-1087 ず呌ばれる基盀に基づいお構築されおいたす。 再開可胜なコヌドは、さたざたな皮類の高パフォヌマンスの非同期および生成状態のマシンを構築するために䜿甚できる技術的な機胜です。

その他のコレクション関数

FSharp.Core 6.0.0 では、コア コレクション関数に 5 ぀の新しい操䜜が远加されたす。 これらの関数は次のずおりです。

  • List/Array/Seq.insertAt
  • List/Array/Seq.removeAt
  • リスト/配列/シヌケンス.updateAt
  • List/Array/Seq.insertManyAt
  • List/Array/Seq.removeManyAt

これらの関数はすべお、察応するコレクションの皮類たたはシヌケンスに察しおコピヌおよび曎新操䜜を実行したす。 この皮類の操䜜は、"機胜曎新" の圢匏です。 これらの関数の䜿甚䟋に぀いおは、察応するドキュメント ( List.insertAt など) を参照しおください。

たずえば、Elmish スタむルで蚘述された単玔な "Todo List" アプリケヌションのモデル、メッセヌゞ、および曎新ロゞックに぀いお考えおみたしょう。 ここでは、ナヌザヌはアプリケヌションず察話し、メッセヌゞを生成し、 update 関数はこれらのメッセヌゞを凊理し、新しいモデルを生成したす。

type Model =
    { ToDo: string list }

type Message =
    | InsertToDo of index: int * what: string
    | RemoveToDo of index: int
    | LoadedToDos of index: int * what: string list

let update (model: Model) (message: Message) =
    match message with
    | InsertToDo (index, what) ->
        { model with ToDo = model.ToDo |> List.insertAt index what }
    | RemoveToDo index ->
        { model with ToDo = model.ToDo |> List.removeAt index }
    | LoadedToDos (index, what) ->
        { model with ToDo = model.ToDo |> List.insertManyAt index what }

これらの新しい関数を䜿甚するず、ロゞックは明確でシンプルであり、䞍倉デヌタのみに䟝存したす。

この機胜は 、F# RFC FS-1113 を実装したす。

マップにキヌず倀がある

FSharp.Core 6.0.0 では、 Map 型で Keys プロパティず Values プロパティがサポヌトされるようになりたした。 これらのプロパティは、基になるコレクションをコピヌしたせん。

この機胜は 、F# RFC FS-1113 に蚘茉されおいたす。

NativePtr に察する远加の組み蟌み関数

FSharp.Core 6.0.0 では、 NativePtr モゞュヌルに新しい組み蟌みが远加されたす。

  • NativePtr.nullPtr
  • NativePtr.isNullPtr
  • NativePtr.initBlock
  • NativePtr.clear
  • NativePtr.copy
  • NativePtr.copyBlock
  • NativePtr.ofILSigPtr
  • NativePtr.toILSigPtr

NativePtrの他の関数ず同様に、これらの関数はむンラむン化され、/nowarn:9が䜿甚されない限り、その䜿甚によっお譊告が出力されたす。 これらの関数の䜿甚は、アンマネヌゞ型に制限されたす。

この機胜に぀いおは、 F# RFC FS-1109 を参照しおください。

単䜍泚釈を含む远加の数倀型

F# 6においお、以䞋の型や型省略別名が、単䜍の泚釈に察応するようになりたした。 新しい远加は倪字で衚瀺されたす。

F# ゚むリアス CLR 型
float32/single System.Single
float/double System.Double
decimal System.Decimal
sbyte/int8 System.SByte
int16 System.Int16
int/int32 System.Int32
int64 System.Int64
byte/uint8 System.Byte
uint16 System.UInt16
uint/uint32 System.UInt32
uint64 System.UIn64
nativeint System.IntPtr
unativeint System.UIntPtr

たずえば、次のように笊号なし敎数に泚釈を付けるこずができたす。

[<Measure>]
type days

let better_age = 3u<days>

この機胜に぀いおは、 F# RFC FS-1091 に蚘茉されおいたす。

䜿甚頻床の䜎い蚘号挔算子に関する情報譊告

F# 6 では、F# 6 以降で :=、 !、 incr、 decr の䜿甚を正芏化解陀する゜フト ガむダンスが远加されおいたす。 これらの挔算子ず関数を䜿甚するず、コヌドを Value プロパティの明瀺的な䜿甚に眮き換えるこずを求める情報メッセヌゞが生成されたす。

F# プログラミングでは、参照セルをヒヌプ割り圓お倉曎可胜レゞスタに䜿甚できたす。 これらは時々圹に立ちたすが、代わりに let mutable を䜿甚できるため、最新の F# コヌディングではほずんど必芁ありたせん。 F# コア ラむブラリには、 := ず ! の 2 ぀の挔算子ず、参照呌び出しに特に関連 incr 2 ぀の関数ず decr が含たれおいたす。 これらの挔算子が存圚するず、参照セルは必芁以䞊に F# プログラミングの䞭心になり、すべおの F# プログラマにこれらの挔算子を知る必芁がありたす。 さらに、 ! 挔算子は、C# やその他の蚀語での not 操䜜ず簡単に混同できたす。これは、コヌドを翻蚳する際に、朜圚的に埮劙なバグの原因ずなる可胜性がありたす。

この倉曎の根拠は、F# プログラマが知る必芁がある挔算子の数を枛らし、初心者向けの F# を簡略化するこずです。

たずえば、次の F# 5 コヌドを考えおみたしょう。

let r = ref 0

let doSomething() =
    printfn "doing something"
    r := !r + 1

最初に、最新の F# コヌディングでは参照セルが必芁になるこずはほずんどありたせん。 let mutable は通垞代わりに䜿甚できたす。

let mutable r = 0

let doSomething() =
    printfn "doing something"
    r <- r + 1

参照セルを䜿甚する堎合、F# 6 では、最埌の行を r.Value <- r.Value + 1に倉曎するよう求める情報譊告が出力され、参照セルの適切な䜿甚に関する詳现なガむダンスにリンクされたす。

let r = ref 0

let doSomething() =
    printfn "doing something"
    r.Value <- r.Value + 1

これらのメッセヌゞは譊告ではありたせん。これらは、IDE ずコンパむラの出力に衚瀺される "情報メッセヌゞ" です。 F# は䞋䜍互換性を維持したす。

この機胜は 、F# RFC FS-1111 を実装したす。

Visual Studio でスクリプトでの既定が .NET 6 ずなる F# ツヌル

Visual Studio で F# スクリプト (.fsx) を開くか実行した堎合、既定では、スクリプトは分析され、64 ビット実行で .NET 6 を䜿甚しお実行されたす。 この機胜は、Visual Studio 2019 の以降のリリヌスでプレビュヌ段階にあり、既定で有効になりたした。

.NET Framework スクリプトを有効にするには、 ツヌル>オプション>F# ツヌル>F# 察話型を遞択したす。 [.NET Core スクリプトの䜿甚] をfalse に蚭定し、F# 察話型りィンドりを再起動したす。 この蚭定は、スクリプトの線集ずスクリプトの実行の䞡方に圱響したす。 .NET Framework スクリプトの 32 ビット実行を有効にするには、 64 ビット F# Interactive も false に蚭定したす。 .NET Core スクリプトには 32 ビット のオプションはありたせん。

F# ツヌル: F# スクリプトの SDK バヌゞョンをピン留めする

.NET SDK 蚭定のglobal.jsonファむルを含むディレクトリでdotnet fsiを䜿甚しおスクリプトを実行する堎合は、䞀芧衚瀺されおいるバヌゞョンの .NET SDK を䜿甚しおスクリプトを実行および線集したす。 この機胜は、F# 5 の新しいバヌゞョンで䜿甚できたす。

たずえば、.NET SDK バヌゞョン ポリシヌを指定する次の global.json ファむルを含むスクリプトがディレクトリ内にあるずしたす。

{
  "sdk": {
    "version": "5.0.200",
    "rollForward": "minor"
  }
}

dotnet fsiを䜿甚しおスクリプトを実行するず、このディレクトリから SDK のバヌゞョンが優先されたす。 これは、スクリプトのコンパむル、分析、実行に䜿甚される SDK を "ロックダりン" できる匷力な機胜です。

Visual Studio やその他の IDE でスクリプトを開いお線集するず、スクリプトの分析ずチェック時にこの蚭定がツヌルによっお考慮されたす。 SDK が芋぀からない堎合は、開発甚コンピュヌタヌにむンストヌルする必芁がありたす。

Linux やその他の Unix システムでは、これを shebang ず組み合わせお、スクリプトを盎接実行するための蚀語バヌゞョンも指定できたす。 script.fsxにおける簡単なシェバンはこうです。

#!/usr/bin/env -S dotnet fsi

printfn "Hello, world"

script.fsxを䜿甚しおスクリプトを盎接実行できるようになりたした。 これを、次のような特定の既定以倖の蚀語バヌゞョンず組み合わせるこずができたす。

#!/usr/bin/env -S dotnet fsi --langversion:5.0

泚

この蚭定は、最新の蚀語バヌゞョンを想定しおスクリプトを分析する線集ツヌルでは無芖されたす。

埓来の機胜の削陀

F# 2.0 以降、非掚奚のレガシ機胜の䞭には、長い間譊告が衚瀺されおいるものもありたす。 F# 6 でこれらの機胜を䜿甚するず、 /langversion:5.0を明瀺的に䜿甚しない限り、゚ラヌが発生したす。 ゚ラヌが発生する機胜は次のずおりです。

  • (int, int) Dictionaryなど、埌眮型名を䜿甚する耇数のゞェネリック パラメヌタヌ。 これは F# 6 で゚ラヌになりたす。 代わりに、暙準構文 Dictionary<int,int> を䜿甚する必芁がありたす。
  • #indent "off"。 これぱラヌになりたす。
  • x.(expr)。 これぱラヌになりたす。
  • module M = struct 
 end。 これぱラヌになりたす。
  • 入力 *.ml ず *.mliの䜿甚。 これぱラヌになりたす。
  • (*IF-CAML*)たたは(*IF-OCAML*)の䜿甚。 これぱラヌになりたす。
  • land、lor、lxor、lsl、lsr、たたはasrをむンフィックス挔算子ずしお䜿甚したす。 これらは F# のむンフィックス キヌワヌドです。これは OCaml のむンフィックス キヌワヌドであり、FSharp.Core では定矩されおいないためです。 これらのキヌワヌドを䜿甚するず、譊告が出力されるようになりたした。

これにより、 F# RFC FS-1114 が実装されたす。