Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics F#代码引用和通用函数_Generics_F# - Fatal编程技术网

Generics F#代码引用和通用函数

Generics F#代码引用和通用函数,generics,f#,Generics,F#,如果您试图在符号之间包含一个泛型函数,比如 <@@ let f x = x in f 1 @@> 出现以下编译错误: 引用表达式中不允许使用内部泛型函数。考虑添加一些类型约束,直到该函数不再是泛型。 这是一个实现限制(缺少的特性尚未实现)还是一个概念问题(或者两者都有) 编辑:只是为了澄清,即使使用符号键入报价,也会出现相同的错误 编辑2:但是,您可以使用ReflectedDefinitionAttribute注释一个泛型函数,该函数的AST应通过反射可用。泛型定义需要对API

如果您试图在符号之间包含一个泛型函数,比如

<@@ let f x = x in f 1 @@>

出现以下编译错误:

引用表达式中不允许使用内部泛型函数。考虑添加一些类型约束,直到该函数不再是泛型。 这是一个实现限制(缺少的特性尚未实现)还是一个概念问题(或者两者都有)

编辑:只是为了澄清,即使使用符号键入报价,也会出现相同的错误


编辑2:但是,您可以使用
ReflectedDefinitionAttribute
注释一个泛型函数,该函数的AST应通过反射可用。

泛型定义需要对API进行大量更改。例如,
quote.Var
类型有三个字段:名称、类型(由
System.type
值表示)和可变标志。但是如果您有泛型定义,那么您需要扩展变量的
Type
属性以允许类型参数,而不仅仅是具体的.NET类型。但是表示这些是有点棘手的-如何确保相等正确工作(例如,在
let z=let x(a:'a)=a in let y(a:'a)=a in x,y
这两个
'a
是独立的,不应该被视为相等的,并且推断的签名是
z:('a->'a)*('b->'b)

更糟糕的是,如果泛型类型是定义的内部类型(如您的示例),那么至少表达式的整体类型仍然可以在现有的F#type系统中表示(例如,作为
quote.Expr
)。但是如果类型变量可以“转义”,然后我们遇到了一些棘手的问题。例如,
x@>
的类型是什么?我们希望它类似于
quotes.Expr
,但在今天的F#中,这当然不是有效的类型


这并不是说解决这些问题是不可能的,但这需要大量的设计、实现和测试工作,以及对类型系统的非琐碎更改。

可以吗?-->定义了一个类型化的代码引号。不,你会得到同样的错误。这只是一个例子吗?如果不是,错误说明了一切-你可能会这样做不使用内部函数gene@CarstenKönig.我知道这一点。谢谢。不过,我很想知道问题是否在于引用是如何实现的(即Microsoft没有为通用函数实现引用)或者这在概念上是不可能做到的。所以限制涉及到报价的实施或报价的概念?如果你在某个会议上遇到了Don,那么我肯定没有资格回答你任何问题;)-我的猜测是,它对内部函数使用
表示
,这当然不适用于通用参数