Более короткий путь к ограничению функции
-
09-10-2019 - |
Вопрос
Я ищу более короткий путь (если есть), чтобы ограничить функцию. Например
let inline sincos (a:'T) =
let y = sin a
let x = cos a
y, x
Для использования этой функции «не нужно будет поддерживать оба Sin
и Cos
Статические участники. Я могу ограничить его работать на Float32 с:
let sincosf = sincos : float32 -> float32 -> float32
или используя подстановочный знак:
let sincosf = sincos : float32 -> _
Мой вопрос в том, можно было бы добавить тип параметра в sincos
Так что я просто должен написать:
let sincosf = sincos<float32>
Заранее спасибо.
Решение
Конечно, let sincosf = sincos<float32>
даст вам предупреждение, но будет работать как есть.
Как я уже отметил в комментариях, должно быть возможно ястно предоставить параметр типа по определению sincos
что удалит предупреждение. Однако это также требует всех предполагаемых ограничений на этот параметр, который будет указан, который может быть немного уродливым. В этом случае Compiler F # неожиданно отклоняет определение:
let inline sincos< ^t when ^t : (static member Sin : ^t -> ^t)
and ^t : (static member Cos : ^t -> ^t)> (a: ^t) =
let y = sin a
let x = cos a
y, x
Я считаю, что это запись компилятора.