Seq seq type в качестве параметра-члена в F # - PullRequest
11 голосов
/ 29 июля 2010

почему не работает этот код?

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>>'

Ответы [ 2 ]

9 голосов
/ 29 июля 2010

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

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

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

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

6 голосов
/ 29 июля 2010

Сообщение об ошибке описывает проблему - в 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
...