Secondo il F # spec (vedi §6.5.7), semplice per cicli sono delimitate da intero (int
alias int32
alias System.Int32
) limiti start
e stop
, ad esempioPerché le espressioni di loop semplici sono limitate agli intervalli interi?
for i = start to stop do
// do sth.
mi chiedo perché i limiti di iterazione per questo tipo di ciclo for sono tenuti ad essere int32
. Perché non consentire uint32
? int64
? bigint
?
Sono consapevole che le espressioni di iterazione sequenziale (for ... in ...
) possono scorrere su sequenze arbitrarie; che tuttavia richiede l'allocazione di un iteratore e chiama MoveNext
e Current
e cosa no e può quindi essere considerevolmente meno efficiente di un ciclo normale potrebbe essere (incremento contatore, confronto, salto condizionale). Per evitare che, si sono bloccati con l'utilizzo di while
e un incrementali manualmente contatori di ciclo ...
Stranamente, F # non permette non int32
limiti di loop, se l'espressione for
è avvolto in una sequenza di espressione, per esempio
seq { for i = 0I to 10I do
printfn "%A" i }
Quindi, credo che la domanda è: C'è un motivo particolare per consentendo solo int32
per i cicli? E perché questa restrizione non si applica ai cicli for
avvolti nelle espressioni seq
?
In generale, il quadro NET utilizza 'int' come numero intero di impiego generale, compreso l'utilizzo in tutti i tipi di scenari di indicizzazione numerici. Esempio: http://msdn.microsoft.com/en-us/library/system.array.indexof(v=vs.71).aspx. Counter-esempio: http://msdn.microsoft.com/en-us/library/system.io.filestream.position.aspx, che utilizza un lungo. –
F # incoraggia la programmazione funzionale e quindi si ferma a corto di pieno supporto imperativo (ad esempio, la mancanza di 'break' /' return'). All'interno di un'espressione di calcolo 'for' è desugared ad una chiamata al metodo, che non è intrinsecamente imperativa come un ciclo, e quindi non ha gli stessi limiti. Posso capire il mistero però. +1 – Daniel
@Daniel +1 "All'interno di un'espressione di calcolo per è desugared a una chiamata di metodo". Io vedo; in realtà il codice generato per 'seq {for .. to .. do ..}' e 'seq {for .. in .. do}' è in gran parte identico, entrambi vengono trasformati in un enumeratore 'GeneratedSequenceBase <_>'. – Frank