Что означает # в типах сигнатур типа seq<#seq<'a>>
по сравнению с просто seq<seq<'a>>
?
Что означает знак # (знак фунта) в подписях типа?
Ответ 1
Это называется гибким типом. Краткое описание состоит в том, что #type
означает любой тип, который унаследован от type
. Итак, в вашем конкретном примере seq<#seq<'a>>
будет последовательность любых коллекций, содержащих значения 'a
.
При вызове функции F # автоматически передает конкретные типы в интерфейсы - так, например, вы можете вызвать функцию, принимающую seq<'a>
с массивом 'a[]
в качестве аргумента. Однако это не работает, когда у вас есть массив массивов, потому что 'a[][]
реализует только seq<'a[]>
, но не seq<seq<'a>>
.
Например, следующие две функции возвращают список длин вложенных последовательностей:
let f1 (s:seq<seq<'T>>) = [ for i in s -> Seq.length i ]
let f2 (s:seq<#seq<'T>>) = [ for i in s -> Seq.length i ]
Но только один из них можно вызвать в списках списков:
[ [1]; [2;3] ] |> f1
// error FS0001: The type 'int list list' is not
// compatible with the type 'seq<seq<'a>>'
[ [1]; [2;3] ] |> f2
// val it : int list = [1; 2]