有没有一种方法可以将泛型类型限制为一组类型的成员?

时间:2020-10-18 18:18:51

标签: generics f#

我有以下记录

type RecordPath<'a,'b> = {
    Get: 'a -> 'b
    Path:string
}

我想约束'b成为自然可以在关系数据库列(int; string; DateTime;中表示的类型集的成员。等)。

我可以使用一个类而不是带有私有构造函数和一些只能满足我所关心类型的静态创建器方法的记录。但是我想知道是否有一种方法可以记录下来。

我还考虑过用这样的东西扩展我想允许的类型

type String with static member CanBeUsedInRecordPath = true

然后将SRTP用于在RecordPath上运行的所有功能,但是从技术上来说,某人可以决定扩展某种我不想使用该扩展方法支持的类型(尽管不太可能)。

那么在F#中具有私有构造函数的类是唯一的方法吗?

1 个答案:

答案 0 :(得分:2)

以下内容似乎可以满足我的要求。

module RecordPath =
    type RecordPath<'a, 'b> = private {
        Get: 'a -> 'b
        Path:string
    }
    with 
        static member Create (f: 'a -> string) = {Get = f; Path = "not important for this demo"}
        static member Create (f: 'a -> int) = {Get = f; Path = "not important for this demo"}
        static member Create (f: 'a -> DateTime) = {Get = f; Path = "not important for this demo"}

如果有人想出更好的方法,我将稍等一下再接受这个答案。