[英]F# Code Quotations and generic functions
如果您尝试在<@@和@@>符号之间附加泛型函数,请说
<@@ let f x = x in f 1 @@>
您收到以下编译错误:
引号表达式中不允许使用内部泛型函数。 考虑添加一些类型约束,直到此函数不再通用。
这是一个实现限制(尚未实现的缺失功能)还是概念问题(或两者兼而有之)?
编辑:只是为了澄清,即使使用符号<@和@>键入引号也会出现相同的错误。
编辑2:可以,但是,注释的通用功能与ReflectedDefinitionAttribute
其AST应该可以通过反射。
通用定义需要对API进行大量更改。 例如, Quotation.Var
类型有三个字段:名称,类型(由System.Type
值表示)和可变性标志。 但是如果你有泛型定义,那么你需要扩展变量的Type
属性以允许类型参数 ,而不仅仅是具体的.NET类型。 但是代表这些有点棘手 - 你如何确保平等正常工作(例如, let z = let x (a:'a) = a in let y (a:'a) = a in x, y
the the two 'a
s为独立的,不应该被视为相等,并且推断的签名是z: ('a->'a)*('b->'b)
它变得更糟。 如果泛型类型是定义的内部类型(如示例所示),那么至少表达式的整体类型仍然可以在现有的F#类型系统中表示(例如,作为Quotation.Expr<int>
)。 但如果类型变量可以“逃避”,那么我们就会遇到一些棘手的问题。 例如, <@ fun x -> x @>
的类型是什么? 我们希望它类似于Quotations.Expr<forall 'a.'a>
,但当然这不是F#中的有效类型。
这并不是说解决这些问题是不可能的 ,但它需要大量的设计,实现和测试工作,以及对类型系统的非平凡的改变。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.