给定一个定义为let get<'T> var1 var2 : 'T option
的函数,应该给该函数将分配给该记录字段的类型签名是什么?
我尝试了type MyType = {AFunc<'T> : obj -> obj -> 'T option}
的各种排列,但是找不到任何可以引入类型参数的变体。
我可以这样做type MyType = {AFunc: obj -> obj -> obj option}
,这将使我创建记录{AFunc = get},但是由于缺少类型参数而无法应用该函数。
答案 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<_>
的“通用”函数?
如果是前者,则TeaDrivenDev的answer将起作用。
如果是后者,则使用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