我正在努力将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}
但我不能。这里的功能方式是什么?
答案 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
}
但我认为这不值得。