2009-11-10 3 views
1

Seq.cast Использование кажется, постоянно терпят неудачу, даже как-то просто, как следующее:Проблема с использованием 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 

Последние два неудачу с затребованной Cast не действует. Что мне не хватает?

Я пытаюсь использовать Seq.cast, чтобы преобразовать кучу вещей в uint16, но по какой-то причине он всегда терпит неудачу (даже если я аннотирую его с помощью Seq.cast<uint32>). Что с этим?

ответ

7

Я считаю, что это происходит потому, что Seq.cast только у типа бросает, а этот тип принуждения вы хотите Seq.map uint32 c |> Seq.reduce (^^^).

Разница между литьем и принуждением является то, что в то время как литье изменяет статический тип значение интерпретируется как без изменения его динамический типа (например: Я знаю, что это Animal действительно Dog), принуждающие создает совершенно новое значение .. по крайней мере, с языковой точки зрения. Разделение в CLR, по-видимому, в значительной степени связано с типами значений (принуждение) и ссылочными типами (литье), что делает его немного легче поддерживать прямо.

+0

О, я вижу. Seq.cast пытается лишить контейнер, а не его содержимое – gradbot

+0

Не совсем: while 'Seq.cast ['a'; 'b'] 'отличает' char seq' к 'uint32 seq' (успешно, даже), ошибка возникает, когда значения перечисляются: когда считывается свойство' IEnumerable .Current', оно пытается и не удается переведите 'char' в' uint32', когда ему нужно его принудить, с помощью функции 'uint32'. –

+0

Я имел в виду 'IEnumerator', а не' IEnumerable', конечно. Если это не ясно, 'Seq' является просто псевдонимом для' IEnumerable'. –

2

Смотрите также

What does this C# code look like in F#? (part one: expressions and statements)

который обсуждает, как слепки могут означать (по крайней мере) 4 различные операции в C#, и как каждый из этих различных операций карты для конкретной функциональности F #.

+0

Это полезный ресурс, спасибо. – MighMoS