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