2016-04-11 8 views

答えて

5

F#'T byrefは通常の型として表示されますが、表の下にはありません。これはC#のrefoutのパラメータに対応しています。これらはメソッド引数の特殊な注釈です。このため、'T byrefはF#でちょっと奇妙です。

私は機能T1 -> T2が方法T2 Invoke(T1 arg)FSharpFunc<T1, T2>としてコンパイルされているので、あなたは、通常のF#の機能を通してそれを使用することはできませんだと思う - それは本当のタイプではないとして、あなたは(ジェネリックにbyrefタイプを渡すことはできません)。これにより

type FastAction<'T> = delegate of 'T byref -> unit 

、あなたがアレイの上に直接iter2Dその繰り返し処理を記述することができます:

この問題を回避するには、byrefタイプがあり、独自のデリゲートを定義することです

let iter2D (map:FastAction<'T>) (arr: 'T[][]) = 
    for y = 0 to arr.Length - 1 do 
     let row = arr.[y] 
     for x = 0 to row.Length - 1 do 
      map.Invoke(&arr.[y].[x]) 

以下はその後、変異します配列内の値:

let arr = [| [| 0 |] |] 
iter2D (FastAction(fun a -> a <- 10)) arr 
+1

ref'は実際の型ではない?そして、['MakeByRefType()'](https://msdn.microsoft.com/library/system.type.makebyreftype.aspx)は何を返すのですか?また、['IsByRef'](https://msdn.microsoft.com/library/system.type.isbyref.aspx)プロパティは何ですか? – PetSerAl

+0

Yuk、 'FastAction(fun bla ...)'は2つの割り当てを引き起こします...しかし、F#にはC#のような別個の匿名デリゲート構文がありません。 – Asik

関連する問題