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