почему это не кодирует работу?
type Test() =
static member func (a: seq<'a seq>) = 5.
let a = [[4.]]
Test.func(a)
Это дает следующую ошибку:
The type 'float list list' is not compatible with the type 'seq<seq<'a>>'
Измените свой код на
type Test() =
static member func (a: seq<#seq<'a>>) = 5.
let a = [[4.]]
Test.func(a)
Уловка заключается в типе файла. Вам необходимо явно разрешить внешнему seq содержать экземпляры подтипов seq <'a> и для seq <' a>. Использование символа # позволяет это сделать.
Сообщение об ошибке описывает проблему - в F # list
несовместим с >
seq
.
Функция upcast
помогает обойти это, превращая в
в список
, который затем совместим с seq
:
let a = [upcast [4.]]
Test.func(a)
Edit: Вы можете сделать func
более гибким в отношении типов, которые он принимает. Оригинал принимает только последовательности seq <'a>
. Хотя list <'a>
реализует seq <' a>
, типы не идентичны, и компилятор выдает ошибку.
Однако вы можете изменить func
, чтобы принимать последовательности любого типа, если этот тип реализует seq <'a>
, записав внутренний тип как # seq
:
type Test() =
static member func (a: seq<#seq<'a>>) = 5.
let a = [[4.]]
Test.func(a) // works