2014-01-22 2 views
3

Согласно документации MSDN по для ... Переберите в F #:Для цикла не выводя целое число без знака

The type of the identifier is inferred from the type of the start and finish expressions. Types for these expressions must be 32-bit integers.

Но, с ниже код, я получаю следующее время компиляции ошибка:

for bar = 0u to 5u do 
    let baz : uint32 = bar 
    () 
error FS0001: This expression was expected to have type 
    int  
but here has type 
    uint32 

Если я поставил петлю внутри последовательности, хотя, она компилируется без ошибок:

let foo = 
    seq { 
     for bar = 0u to 5u do 
      let baz : uint32 = bar 
      yield baz 
    } 
val foo : seq<uint32> 

Что происходит? Почему for-loop выводит uint32 во втором примере, но не в первую очередь?

У меня есть внешняя библиотека, которая принимает 32-битное целое число без знака в качестве индекса. Мне нужно перебирать от 0 до длины коллекции (также uint32) минус один. Когда я помещаю эту логику в последовательность и получаю каждый элемент, он компилируется без ошибок и работает просто отлично. Но когда я пытаюсь прочитать все элементы вне последовательности, компилятор бомбит. Я вынужден выполнить диалог типа от uint32 до int и обратно, что, на мой взгляд, имеет очень плохой запах.

+0

Смотрите комментарии на связанный вопрос того, почему он работает в выражении последовательности. – Daniel

+0

@ Daniel - uint32 - это 32-разрядное целое число. – JDB

+0

Нет, это 32-разрядное _unsigned_ integer. 'int '- единственное 32-битное целое число. – Daniel

ответ

4

Как объяснено в this comment Даниилом,

... Within a computation expression for is desugared to a method call, which isn't inherently imperative like a loop, and therefore doesn't have the same limits. ...

Вот простой работы вокруг:

for bar in 0u .. 5u do 
    let baz : uint32 = bar 
    () 
Смежные вопросы