繁体   English   中英

F#代码报价和通用功能

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM