Как избежать ошибок ограничения значения с помощью F # Seq.cast?

Я вижу, что у Seq есть функция преобразования из IEnumerable в Seq, но как мне заставить ее работать?

open System.Text.RegularExpressions;;
let v = Regex.Match("abcd", "(ab)");;
Seq.cast (v.Captures);;

Это производит,

ошибка FS0030: ограничение значения. Предполагается, что значение 'it' имеет универсальный тип val it: seq ‹'_ a>
Либо определите' it 'как простой термин данных, сделайте его функцией с явными аргументами или, если вы этого не собираетесь чтобы быть универсальным, добавьте аннотацию типа.


person gatoatigrado    schedule 07.06.2010    source источник


Ответы (2)


Четко укажите тип:

Seq.cast<Match> (v.Captures)

В противном случае cast нужен контекст для вывода правильного типа возвращаемого значения, а в отдельной строке, подобной этой, нет такого контекста для использования вывода типа.

(Эта строка преобразует неуниверсальный IEnumerable в общий IEnumerable<Match>, также известный как seq<Match>.)

person Brian    schedule 07.06.2010

На самом деле есть два способа указать тип, который вы хотите получить. Брайан опубликовал, как это сделать, явно указав параметр типа для функции:

let res = Seq.cast<Match> v.Captures

Другой вариант - использовать аннотации типов, которые можно разместить вокруг любого выражения F # и указать тип выражения - таким образом вы можете намекнуть на определение типа компилятора (указав, что какое-то выражение имеет определенный тип ). Если вы предоставите информацию каким-либо умным способом, компилятор сможет выяснить, каким должен быть параметр типа для Seq.cast. Несколько примеров:

// By specifying type of the value
let (res:seq<Match>) = Seq.cast v.Captures 

// By specifying return type of a function
let getCaptures () : seq<Match> = 
  // ...
  Seq.cast v.Captures

// By specifying element type when iterating over the result
for (m:Match) in Seq.cast v.Captures do
  // ...

Из всех вариантов я думаю, что Brians (явный) и мой второй (тип возвращаемого значения функции) являются наиболее идиоматическими, однако вы можете выбрать любой вариант, который считаете наиболее читаемым.

person Tomas Petricek    schedule 08.06.2010