Проблема с использованием Seq.cast - PullRequest
1 голос
/ 11 ноября 2009

Использование 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

Последние два сбоя с указанным приведением недействительны. Чего мне не хватает?

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

Ответы [ 2 ]

7 голосов
/ 11 ноября 2009

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

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

2 голосов
/ 11 ноября 2009

Смотри также

Как этот код C # выглядит в F #? (часть первая: выражения и высказывания)

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

...