F#什么时候进行连续折叠?

F#什么时候进行连续折叠?,f#,inline,f#-3.1,constantfolding,F#,Inline,F# 3.1,Constantfolding,我刚刚写了一篇文章,在测试时,我注意到 let quat = (3, 0, 0, 3) (quat |||~||| quat) |> ijk |> printAn 从(3.0f,0.0f,0.0f,3.0f)开始时,完全折叠到printAn(18,0,0)中,只插入原始0.0f和3.0f常量值,而不计算任何浮点运算符,并实例化一些元组(但数量不如在调试模式下) (我使用Visual Studio 2013 Update 4,目标是4.5框架,使用默认的版本配置。取消定义跟踪常量似乎

我刚刚写了一篇文章,在测试时,我注意到

let quat = (3, 0, 0, 3)
(quat |||~||| quat)
|> ijk
|> printAn
(3.0f,0.0f,0.0f,3.0f)
开始时,完全折叠到
printAn(18,0,0)
中,只插入原始
0.0f
3.0f
常量值,而不计算任何浮点运算符,并实例化一些
元组(但数量不如在调试模式下)

(我使用Visual Studio 2013 Update 4,目标是4.5框架,使用默认的
版本
配置。取消定义
跟踪
常量似乎没有什么区别,
未选中打开



我不太关心性能的影响,因为如果它成为一个问题,通过IL-weaving折叠表达式应该很容易,但我仍然对编译器可以折叠的内容感兴趣。

最好在这里添加各种函数的定义。@JohnPalmer这是一大块代码,据我所知没有什么相关性,我只是将其链接起来,以防有人好奇。由于其他所有操作都是相同的,不同之处在于编译器(不)折叠basic
Float32
运算符的方式。@JohnPalmer…尽管创建一个简短的示例来更清楚地说明它可能是个好主意。也许我今天晚些时候会这样做。我认为语言规范不能保证任何折叠(毕竟这只是一个优化),而且编译器本身是一个开源的移动目标,因此答案可能随时改变。也就是说,我认为这个问题在一般情况下是无法回答的,因为即使对于当前的编译器位有一个答案,这个答案在未来的任何时候都可能发生变化。我确实相信,虽然一般来说,浮点折叠的状态比整数更糟糕——我记得最近有一次请求删除
x*1.0
x/1.0
——结果非常复杂。