键入记录字段以使用类型参数保存函数

时间:2018-10-09 23:26:28

标签: f#

给定一个定义为let get<'T> var1 var2 : 'T option的函数,应该给该函数将分配给该记录字段的类型签名是什么?

我尝试了type MyType = {AFunc<'T> : obj -> obj -> 'T option}的各种排列,但是找不到任何可以引入类型参数的变体。

我可以这样做type MyType = {AFunc: obj -> obj -> obj option},这将使我创建记录{AFunc = get},但是由于缺少类型参数而无法应用该函数。

2 个答案:

答案 0 :(得分:3)

您必须使记录类型本身通用。只有这样void insert(Node **node, int x) { if(*node == NULL) { Node *bNode = new Node(x); cout << bNode << "\n"; // prints address of bNode cout << *node << "\n"; // prints NULL which is correct *node = bNode; cout << *node << "\n"; // prints the same address as of bNode cout << bNode->data << "\n"; // prints 8 cout << *node->data << "\n"; // gives error WTF!!! } } 才能被定义和使用。

'T

答案 1 :(得分:3)

您的问题中有些含糊。您是否希望能够将get<'t>存储在一条记录中,以便每条记录一个特定的't,还是想让记录本身存储一个类似get<_>的“通用”函数?

如果是前者,则TeaDrivenDevanswer将起作用。

如果是后者,则使用F#的类型系统没有完全简单的方法:记录字段不能是通用值。

但是,有一个相当干净的解决方法,即使用通用方法声明接口类型并将该接口的实例存储在您的记录中,如下所示:

type OptionGetter = abstract Get<'t> : obj->obj->'t option
type MyType = { AFunc: OptionGetter }
let get<'t> var1 var2 : 't option = None // your real implementation here
let myRecord = { AFunc = { new OptionGetter with member this.Get v1 v2 = get v1 v2} }
let test : int Option = myRecord.AFunc.Get "test" 23.5