F#使用类型变量调用内联函数

时间:2016-06-18 00:28:59

标签: generics f# functional-programming type-variables

我试图为(!)运算符定义更一般的情况,如下所示,

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:\Users\User\AppData\Local\Temp\stdin(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 个答案:

答案 0 :(得分:5)

由于您的getValue功能不是内联的,因此约束无法发挥作用。

问题是.NET类型系统无法存储F#可以在inline中使用的约束类型。

因此,当你有一个非内联函数以这种方式使用内联函数时,就会出错。