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.

в результате, когда у вас не встроенная функция, которая использует встроенную функцию таким образом, вы получите ошибку.