2010-06-07 23 views
2

Je vois que Seq a une fonction de conversion de IEnumerable en Seq, mais comment l'obtenir?Comment éviter les erreurs de "restriction de valeur" avec Seq.cast de F #?

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

Ce produit,

erreur FS0030: restriction de valeur. La valeur 'it' a été déduite pour avoir le type générique val it: seq < '_a>
Soit définir' it 'comme un simple terme de données, en faire une fonction avec des arguments explicites ou, si vous ne l'avez pas prévu pour être générique, ajoutez une annotation de type.

Répondre

8

Soyez explicite sur le type:

Seq.cast<Match> (v.Captures) 

Sinon cast a besoin contexte de déduire le type de retour, et sur une ligne par lui-même comme là, il n'y a pas tel contexte de l'inférence de type à utiliser.

(Cette ligne convertit le IEnumerable<Match> en IEnumerable non générique générique seq<Match> a.k.a..)

6

Il y a en fait deux façons de spécifier le type que vous souhaitez obtenir. Brian a affiché comment faire cela en spécifiant explicitement le paramètre de type à une fonction:

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

L'autre option consiste à utiliser annotations de type qui peut être placé autour de toute expression F # et préciser le type de l'expression - ce façon dont vous pouvez faire allusion à l'inférence du type de compilateur (en disant que certaines expressions ont un type particulier). Si vous fournissez l'information d'une manière intelligente, le compilateur sera capable de comprendre ce que devrait être le paramètre de type à Seq.cast. Quelques exemples:

// 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 
    // ... 

De toutes les options, je pense que le Brians (explicite) et mon second (type d'une fonction de retour) sont ceux qui sont cependant les plus idiomatiques, vous pouvez choisir une option vous trouvez le plus lisible.