Что означает # (знак фунта) в подписях типов?

Что означает # в сигнатурах типа seq<#seq<'a>> по сравнению с просто seq<seq<'a>>?


person Goswin    schedule 15.04.2014    source источник
comment
См. msdn.microsoft.com/en-us/library/dd233228.aspx и, в частности, msdn.microsoft.com/en-us/library/dd233198. aspx.   -  person rightfold    schedule 15.04.2014


Ответы (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]
person Tomas Petricek    schedule 15.04.2014