Как избежать ошибок «Ограничение значений» с помощью F # Seq.cast? - PullRequest
2 голосов
/ 08 июня 2010

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

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

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

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

Ответы [ 2 ]

8 голосов
/ 08 июня 2010

Укажите тип:

Seq.cast<Match> (v.Captures)

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

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

6 голосов
/ 08 июня 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 (явный) и мой второй (возвращаемый тип функции) являются наиболее идиоматическими, однако вы можете выбрать любой вариант, который вам наиболее удобен для чтения.

...