F# вызов встроенной функции с переменными типа
Я пытался определить более общий случай для (! оператора ) следующим образом:
let inline (!) (cell : ^a) =
(^a : (member Value : ^b) cell)
так что это работает не только для ref
тип, но любой тип с Value
член.
> !(ref 10) ;;
val it : int = 10
> !(lazy 5) ;;
val it : int = 5
но проблема возникает когда я пытаюсь применить его к типу переменных типа
> let getValue (c : 'a ref) = !c ;;
let getValue (c : 'a ref) = !c ;;
------------------^^
C:UsersUserAppDataLocalTempstdin(6,19): warning FS0064: This construct causes code to be less generic than indicated by the type annotations. The type variable 'a has been constrained to be type 'obj'.
val getValue : c:obj ref -> obj
пока он работает нормально, если я расширить встроенную функцию.
> let getValue (c : 'a ref) = c.Value ;;
val getValue : c:'a ref -> 'a
кто-нибудь знает, почему это происходит? Спасибо.
1 ответов
поскольку getValue
функция не является встроенной, ограничения не будут работать.
проблема в том, что система типов .NET не может хранить тип ограничений, которые F# может использовать в inline
.
в результате, когда у вас не встроенная функция, которая использует встроенную функцию таким образом, вы получите ошибку.