Seq seq вводят как членский параметр в 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>>'
11
задан Oldrich Svec 29 July 2010 в 10:24
поделиться

2 ответа

Измените свой код на

type Test() = 
  static member func (a: seq<#seq<'a>>) = 5. 

let a = [[4.]] 
Test.func(a) 

Уловка заключается в типе файла. Вам необходимо явно разрешить внешнему seq содержать экземпляры подтипов seq <'a> и для seq <' a>. Использование символа # позволяет это сделать.

9
ответ дан 3 December 2019 в 08:02
поделиться

Сообщение об ошибке описывает проблему - в 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
6
ответ дан 3 December 2019 в 08:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: