.net - 是否可以在 F#(完全在 .net 中)中展开循环?

标签 .net f#

所以我所说的循环展开是什么意思

Write "Hello" |> Repeat 5

->>>
Write "Hello"
Write "Hello"
Write "Hello"
Write "Hello"
Write "Hello"

据我所知,这是一些优化,如果可能的话,我只是在 .NET 上感兴趣

顺便说一句 - 就是为什么我必须在 [0..4] 中使用 for i 做......如果我真的不是这个 [0..4] 并且我真的不需要这个我......

最佳答案

F# 语言不直接支持这种元编程形式。您要求的通常称为多阶段编程,并且有基于 ML 的语言支持它(例如搜索 MetaML)。在这些语言中,您可以使用编译代码和(例如)展开循环进行操作。

可以使用引号在 F# 中完成此操作的有限形式。但它不是很实用,因为 F# 引用编译器生成的代码较慢(因此它绝对不能作为优化工作)。

但是,出于好奇,这里是如何使用 F# PowerPack 的引用和引用编译器来实现这一点:

#r @"FSharp.PowerPack.Linq.dll"
open Microsoft.FSharp.Linq.QuotationEvaluation

// Generate quotation that contains 5 prints followed by expression that returns unit
let unrolled = [ 1 .. 5 ] |> List.fold (fun expr _ -> 
    <@ printfn "Hello"; %expr @>) <@ () @>

// Compile the function once & run it two times
let f = unrolled.Compile()
f()
f()

...正如我所提到的,这作为优化没有用,因为 Compile方法产生缓慢的代码,但它在其他一些场景中很有用。

关于.net - 是否可以在 F#(完全在 .net 中)中展开循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5754917/

相关文章:

.net - 创建 .net 类库时出现不受支持的框架错误

c# - F#:一个复杂的记录类型和一个 DataGridView

f# - 变量是否可以在一系列管道运算符期间引用自身,F#

F# 函数(正向管道运算符)不适用于数组?

F#:有没有办法将引用单元格内容标记为 volatile?

c# - 带通配符过滤的绝对路径

c# - 在 emgu CV 中使用 SURF 进行对象识别

c# - 用于处理连续消息流的响应式(Reactive)扩展

F# 将运算符视为函数

c# - 获取 FrameworkElement 边界矩形的坐标