Seq seq type в качестве параметра-члена в F #
Почему этот код не работает?
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>>'
Ответы
Ответ 1
Измените свой код на
type Test() =
static member func (a: seq<#seq<'a>>) = 5.
let a = [[4.]]
Test.func(a)
Фокус в типе a. Вы должны явно разрешить внешнему seq содержать экземпляры seq < 'a > и подтипы seq < 'a > . Использование символа # позволяет это.
Ответ 2
Сообщение об ошибке описывает проблему - в F #, list<list<'a>>
не совместимо с seq<seq<'a>>
.
Функция upcast
помогает обойти это, сделав a
в list<seq<float>>
, который затем совместим с seq<seq<float>>
:
let a = [upcast [4.]]
Test.func(a)
Изменить: Вы можете сделать 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