В общем, нет способа сделать то, что вы хотите, так как нет стандартного способа создания произвольных подтипов 't seq
в F # или .NET. Единственный полу-мейнстримовый язык программирования, который мне известен, который делает что-то похожее на то, что вы ищете, это Scala, а библиотека коллекций Scala общеизвестно запутана.
Чтобы проиллюстрировать одну из проблем с определением более «универсальной» функции Seq.filter
, рассмотрим следующее определение типа:
type Singleton<'t>(t:'t) =
interface seq<'t> with
member __.GetEnumerator() : System.Collections.IEnumerator =
([t] :> System.Collections.IEnumerable).GetEnumerator()
member __.GetEnumerator() : System.Collections.Generic.IEnumerator<'t> =
([t] :> seq<_>).GetEnumerator()
Теперь все экземпляры этого класса имеют ровно один элемент, но фильтрация приведет к последовательности с нулем или одним элементом. Понятно, что это означает, что статический тип
Singleton(1)
|> Seq.filter (fun x -> x > 5)
должно быть чем-то отличным от Singleton<int>
.