Один из относительно простых подходов - представить реализацию двух интерфейсов как членов типа, который вы пишете. Это можно сделать довольно просто, используя выражения объекта или просто написав фрагмент кода, который создает некоторый тип и возвращает его в результате. Второй подход будет выглядеть так:
type MyCollection<'K, 'V when 'K : equality>(keys:list<'K>, values:list<'V>) = //'
member x.Dictionary =
Seq.zip keys values |> dict
member x.Enumerable =
values |> List.toSeq
Первый подход (если вы хотите реализовать методы интерфейсов напрямую, будет выглядеть примерно так:
type MyCollection<'K, 'V when 'K : equality>(keys:list<'K>, values:list<'V>) = //'
member x.Dictionary =
{ new IDictionary<'K, 'V> with
member d.Add(k, v) = ... }
member x.Enumerable =
// Similarly for IEnumerable
values |> List.toSeq
Представление реализаций как функций в модуле, как упоминалось в kvb, также является отличным вариантом - я думаю, что многие из стандартных типов библиотек F # на самом деле делают оба варианта (так что пользователь может выбрать стиль, который он / она предпочитает ). Это можно добавить так:
module MyCollection =
let toDict (a:MyCollection<_, _>) = a.Dictionary