type FFRec<'state when 'state: (member Tape: Stack<unit -> unit>)
and 'state: (member Mem: ObjectPool)
and 'state: (member Str: CudaStream)
and 'state: (member Workspace: Workspace)
and 'state: (member IsInferenceOnly: bool)> =
{
W: d2M
b: d2M
a: d2M -> 'state -> d2M * 'state
}
インターフェイスですべてのそれらのメンバーの制約を交換することが可能であるが、そのアプローチの小さな問題は、コンパイラは、私は例えば、このような機能を持っている場合ことを実現するために十分にスマートではないということです。メンバの制約を持つ型の省略形を作ることはできますか?
let inline reluInitializer (state: ^state) (a: ^a) =
let scale = (1.0f/sqrt(addDims a |> float32))
fillRandomUniformMatrix((str state),a,scale,0.0f)
a
^state
にはインターフェイスの制約があり、不可解なシグネチャが必要であり、実装ではレコードジェネリックパラメータ宣言のエラーが異なることに気付かないでしょう。
可能であれば、明示的なインターフェイスよりもメンバの制約を使用したいと思いますが、タイプの省略形を使用して上記の制約の宣言を短くする方法を見つけることができませんでした。それは現在のF#で可能でしょうか?
キーワード 'inline'を調べます。 F#は、あなたがしようとしているもののための最良の近似です。 – asibahi