Более короткий путь к ограничению функции

StackOverflow https://stackoverflow.com/questions/4430770

  •  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

Я считаю, что это запись компилятора.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top