如何在 f# 中将类型保持为泛型?
How do I keep a type as generic in f#?
我正在努力设置一个 f# 函数,以便它可以接受类型(来自 c#)Dictionary<keys, dynamic>
其中键只是枚举类型,而 dynamic 将是一个包含参数的 scruct 类型。
我的 f# 函数如下所示:
let func (stores: Dictionary<keys, 'values>) =
let newObj1State = object1.addOne(stores.[keys.0])
let newObj2State = object2.addOne(stores.[keys.1])
let newSystemState = new Dictionary<keys, 'values>()
newSystemState.Add(keys.0, newObj1State);
newSystemState.Add(keys.1, newObj2State);
newSystemState
我遇到的问题是,当 f# 编译器运行该函数时,它发现 'values
首先被引用为 Object1 类型,因此它假定 'values
是 Object1 类型并且向调用命令抛出此错误。
cannot convert from 'System.Collections.Generic.Dictionary<Types.keys, dynamic>' to 'System.Collections.Generic.Dictionary<Types.keys, Types.Object1>
有没有办法让 'values
保持通用,这样它就不会从代码中推断出数据类型?
方法 object1.AddOne
可能需要一个 Object1
作为其参数,这会触发编译器将“值”的类型推断为 Object1
。如果是这种情况,那么您只需将 object1.AddOne(stores.[keys.0])
替换为 object1.AddOne(box stores.[keys.0])
.
函数box
基本上告诉编译器"upcast what I'm giving you to obj
"。在将某些内容传递给 addOne
之前向上转型让编译器知道它不应该假设值的类型与 addOne
.
的签名完全匹配
我正在努力设置一个 f# 函数,以便它可以接受类型(来自 c#)Dictionary<keys, dynamic>
其中键只是枚举类型,而 dynamic 将是一个包含参数的 scruct 类型。
我的 f# 函数如下所示:
let func (stores: Dictionary<keys, 'values>) =
let newObj1State = object1.addOne(stores.[keys.0])
let newObj2State = object2.addOne(stores.[keys.1])
let newSystemState = new Dictionary<keys, 'values>()
newSystemState.Add(keys.0, newObj1State);
newSystemState.Add(keys.1, newObj2State);
newSystemState
我遇到的问题是,当 f# 编译器运行该函数时,它发现 'values
首先被引用为 Object1 类型,因此它假定 'values
是 Object1 类型并且向调用命令抛出此错误。
cannot convert from 'System.Collections.Generic.Dictionary<Types.keys, dynamic>' to 'System.Collections.Generic.Dictionary<Types.keys, Types.Object1>
有没有办法让 'values
保持通用,这样它就不会从代码中推断出数据类型?
方法 object1.AddOne
可能需要一个 Object1
作为其参数,这会触发编译器将“值”的类型推断为 Object1
。如果是这种情况,那么您只需将 object1.AddOne(stores.[keys.0])
替换为 object1.AddOne(box stores.[keys.0])
.
函数box
基本上告诉编译器"upcast what I'm giving you to obj
"。在将某些内容传递给 addOne
之前向上转型让编译器知道它不应该假设值的类型与 addOne
.