gpt4 book ai didi

generics - F# 代码引用和泛型函数

转载 作者:行者123 更新时间:2023-12-02 21:45:12 31 4
gpt4 key购买 nike

如果您尝试将通用函数括在 <@@@@> 符号之间,请说

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

您收到以下编译错误:

Inner generic functions are not permitted in quoted expressions. Consider adding some type constraints until this function is no longer generic.

这是一个实现限制(尚未实现的缺失功能)还是一个概念问题(或者可能两者兼而有之)?

编辑:只是为了澄清,即使使用符号 <@@> 键入引号,也会发生相同的错误。

编辑 2:但是,您可以使用 ReflectedDefinitionAttribute 注释通用函数,其 AST 应可通过反射使用。

最佳答案

通用定义需要对 API 进行大量更改。例如,Quotation.Var type 具有三个字段:名称、类型(由 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# 类型系统中表示(例如 Quotation.Expr<int> )。但如果类型变量可以“转义”,那么我们就会遇到一些棘手的问题。例如 <@ fun x -> x @> 的类型是什么?我们希望它类似于 Quotations.Expr<forall 'a.'a> ,但这当然不是当今 F# 中的有效类型。

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

关于generics - F# 代码引用和泛型函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26710818/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com