Более короткий способ ограничения функции - PullRequest
1 голос
/ 13 декабря 2010

Я ищу более короткий способ (если он есть) для ограничения функции. Э.Г.

let inline sincos (a:'T) =
    let y = sin a
    let x = cos a
    y, x

Для использования этой функции 'T потребуется поддержка статических членов Sin и Cos. Я могу заставить его работать на float32:

let sincosf = sincos : float32 -> float32 -> float32

или с использованием какого-либо подстановочного знака:

let sincosf = sincos : float32 -> _

Мой вопрос: возможно ли добавить параметр типа к sincos, поэтому мне просто нужно написать:

let sincosf = sincos<float32>

Заранее спасибо.

1 Ответ

2 голосов
/ 13 декабря 2010

Действительно, let sincosf = sincos<float32> выдаст вам предупреждение, но будет работать как есть.

Как я отмечал в комментариях, должна быть возможность явно указать параметр типа в определении sincos, который бы убрал предупреждение. Однако это также требует указания всех предполагаемых ограничений для этого параметра, что может быть немного уродливо. В этом случае 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

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

...