F#'T byref
は通常の型として表示されますが、表の下にはありません。これはC#のref
とout
のパラメータに対応しています。これらはメソッド引数の特殊な注釈です。このため、'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
ref'は実際の型ではない?そして、['MakeByRefType()'](https://msdn.microsoft.com/library/system.type.makebyreftype.aspx)は何を返すのですか?また、['IsByRef'](https://msdn.microsoft.com/library/system.type.isbyref.aspx)プロパティは何ですか? – PetSerAl
Yuk、 'FastAction(fun bla ...)'は2つの割り当てを引き起こします...しかし、F#にはC#のような別個の匿名デリゲート構文がありません。 – Asik