如何在 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.

的签名完全匹配