2009-11-10 9 views
1

L'utilisation Seq.cast semble échouer en permanence, même pour quelque chose d'aussi simple que ce qui suit:Problème d'utilisation Seq.cast

let xor c = Seq.cast c |> Seq.reduce (^^^) 
xor [1;3]  // Works, assuming because no cast is necessary 
xor ['a';'b'] // Fails 
xor [2u]  // Fails 

Les deux derniers ne CAST indiqué est incorrect. Qu'est-ce que je rate?

Je suis en train d'utiliser Seq.cast pour convertir un tas de choses à uint16, mais pour une raison quelconque, il ne parvient pas toujours (même si j'annoter avec Seq.cast<uint32>). Qu'est-ce qui se passe avec ça?

Répondre

7

Je crois que c'est parce que Seq.cast ne le fera taper moulages plutôt ce type contrainte: vous voulez Seq.map uint32 c |> Seq.reduce (^^^).

La différence entre la coulée et qui exerce la contrainte est que si la coulée change le type statique d'une valeur est interprétée comme sans changer son type dynamique (par exemple: Je sais que ce Animal est vraiment un Dog), qui exerce la contrainte crée une toute nouvelle valeur .. du moins du point de vue linguistique. La répartition dans le CLR semble être à peu près entre les types de valeur (coercition) et les types de référence (casting), ce qui rend un peu plus facile de rester droit.

+0

Oh je vois. Seq.cast essaie de lancer le conteneur et non son contenu – gradbot

+0

Pas tout à fait: while 'Seq.cast ['a'; 'b'] 'lance le' char seq' en un 'uint32 seq' (avec succès, même), l'erreur survient quand les valeurs sont énumérées: quand la propriété' IEnumerable .Current' est lue, elle essaie et échoue à lancer le 'char' dans un' uint32', quand il a besoin de le contraindre, avec la fonction 'uint32'. –

+0

Je voulais dire 'IEnumerator', pas' IEnumerable' bien sûr. Si ce n'est pas clair, 'Seq' est juste un alias pour' IEnumerable'. –