f# - 列表中的for循环

标签 f# control-flow

人们经常使用

for i in [0 .. 10] do something

但是 afaik 创建了一个列表,然后对其进行迭代,在我看来使用它会更有意义
for i = 0 to 10 do something

没有创建不必要的列表但具有相同的行为。
我错过了什么吗? (我想是这样的)

最佳答案

你是对的,写作 for i in [0 .. 10] do something生成一个列表,它确实有很大的开销。虽然你也可以省略方括号,在这种情况下它只会构建一个惰性序列(而且,事实证明编译器甚至优化了这种情况)。我一般更喜欢写作 in 0 .. 100 do因为它看起来与迭代序列的代码相同。

使用 #time F#交互的特性做一个简单的分析:

for i in [ 0 .. 10000000 ] do // 3194ms (yikes!)
  last <- i

for i in 0 .. 10000000 do     // 3ms
  last <- i

for i = 0 to 10000000 do      // 3ms
  last <- i

for i in seq { 0 .. 10000000 } do // 709ms (smaller yikes!)
  last <- i

所以,事实证明编译器实际上优化了 in 0 .. 10000000 do0 to 10000000 do 相同环形。您可以强制它显式创建惰性序列(最后一种情况),这比列表快,但仍然很慢。

关于f# - 列表中的for循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29747854/

相关文章:

types - 如何使用像 map 这样的 while 条件使类型稳定的生成器?

c# - 科学数据可视化和 .NET 框架

python - asyncio as_yielded 来自异步生成器

f# - 如何通过打开文件来使用数据库从服务器向客户端发送和接收数据?

F# 程序在 fsi 中正确运行,但作为 exe 挂起

c - 作业: Trying to sort out what operation I am attempting to compute C

python - 相当于 Python 在 Ruby 中的 "with"

python - 在 Python 3 中使用 "Break"控制流

F# 中的 NullReferenceException

f# - 是在 F# map 上进行迭代还是设置有序遍历?