Gemäß der # spec F (siehe §6.5.7), sind einfach für Loops durch ganzzahlige begrenzt (int
aka int32
aka System.Int32
) begrenzt start
und stop
, z.B.Warum sind einfache For-Schleifenausdrücke auf ganzzahlige Bereiche beschränkt?
for i = start to stop do
// do sth.
Ich frage mich, warum die Iteration Grenzen für diese Art von für Schleife int32
sein müssen. Warum nicht uint32
zulassen? int64
? bigint
?
Ich bin mir bewusst, dass Sequenziterationsausdrücke (for ... in ...
) über beliebige Sequenzen iterieren können; das erfordert jedoch das Zuordnen eines Iterators und das Aufrufen von MoveNext
und Current
und was nicht und kann daher erheblich weniger effizient sein als eine einfache Schleife sein könnte (Inkrementierungs-, Vergleichs, Zustandssprung). Um zu vermeiden, dass, Sie sind mit der Verwendung von while
und ein manuell Inkrementieren Schleifenzähler ...
Merkwürdiger stecken, F # nicht erlaubt nicht int32
Schleifen Grenzen, wenn die for
Expression in einer Sequenz Ausdruck gewickelt wird, z.B.
seq { for i = 0I to 10I do
printfn "%A" i }
Also, ich denke die Frage ist: Gibt es einen bestimmten Grund für die nur int32
für Schleifen ermöglichen? Und warum gilt diese Einschränkung nicht für for
Schleifen, die in seq
Ausdrücke eingebettet sind?
Im Allgemeinen verwendet das .NET Framework 'int' als Allzweck- ganze Zahl, einschließlich ihrer Verwendung in allen Arten von numerischen Teilszenarien. Beispiel: http://msdn.microsoft.com/en-us/library/system.array.indexof(v=vs.71).aspx. Counter-Beispiel: http://msdn.microsoft.com/en-us/library/system.io.filestream.position.aspx, die eine lange verwendet. –
F # fördert die funktionale Programmierung und stoppt daher die volle imperative Unterstützung (z. B. das Fehlen von "break"/"return"). Innerhalb eines Berechnungsausdrucks wird "for" zu einem Methodenaufruf entlüftet, der nicht inhärent zwingend wie eine Schleife ist und daher nicht die gleichen Grenzen hat. Ich kann jedoch das Geheimnis verstehen. +1 – Daniel
@Daniel +1 "Innerhalb eines Berechnungsausdrucks wird für einen Methodenaufruf entzuckert". Aha; Tatsächlich ist der für 'seq {für .. to .. do ..}' und 'seq {für .. in .. do}' generierte Code weitgehend identisch, beide werden in einen 'GeneratedSequenceBase <_> '-Enumerator transformiert. – Frank