2010-12-13 5 views
1

Я ищу более короткий путь (если есть), чтобы ограничить функцию. Например.Более короткий способ ограничения функции

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> 

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

ответ

2

Действительно, 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 

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

+0

Можно ли объявить 'sincos' с явным параметром типа' T ', чтобы предупреждение исчезло? –

+0

В чем причина такого предупреждения? –

+0

@Tim - это возможно сделать; однако вам также необходимо явно включить ограничения. Когда я пытаюсь это сделать для этого примера, компилятор F # становится неожиданно недовольным ... – kvb

Смежные вопросы