通用功能签名

时间:2014-02-18 21:51:26

标签: f#

我正在努力将C#应用程序移植到F#,我有这个界面:

public interface ISerializer
{
    string ContentType { get; }
    string Serialize(object value);
    T Deserialize<T>(string value);
}

所以我想定义一个这样的类型:

type Serializer = {ContentType: string; Serialize: Object -> string; Deserialize<'T>: string -> 'T}

但我不能。这里的功能方式是什么?

1 个答案:

答案 0 :(得分:3)

您可以在F#中定义相同的界面,如下所示:

type ISerializer =
    abstract ContentType : string
    abstract Serialize : obj -> string
    abstract Deserialize<'a> : string -> 'a

无法使用自然功能数据类型(如记录)获得相同的“内部”多态性,因此必须使用OO构造。

如果您真的想要使用记录,可以为Deserialize定义一个包装器并将其放入记录中:

type IDeserializer =
    abstract Deserialize<'a> : string -> 'a

type Serializer =
    {
        ContentType : string
        Serialize : obj -> string
        Deserializer : IDeserializer
    }

但我认为这不值得。