gpt4 book ai didi

F# 柯里化(Currying)效率?

转载 作者:行者123 更新时间:2023-12-03 18:36:40 29 4
gpt4 key购买 nike

我有一个如下所示的函数:

let isInSet setElems normalize p = 
normalize p |> (Set.ofList setElems).Contains

这个函数可以用来快速检查一个元素在语义上是否是某个集合的一部分;例如,要检查文件路径是否属于 html 文件:
let getLowerExtension p = (Path.GetExtension p).ToLowerInvariant()
let isHtmlPath = isInSet [".htm"; ".html"; ".xhtml"] getLowerExtension

但是,当我使用上述函数时,性能很差,因为在“isInSet”中编写的函数体的评估似乎被延迟到所有参数都已知 - 特别是不变位,如 (Set.ofList setElems).Contains每次执行 isHtmlPath 都会重新评估.

我怎样才能最好地保持 F# 的简洁、易读的性质,同时仍然获得更有效的行为,其中集合构造被预先评估。

以上是 只是一个例子 ;我正在寻找一种通用方法,以避免让我陷入实现细节 - 在可能的情况下,我想避免被实现的执行顺序等细节分心,因为这对我来说通常并不重要,并且有点破坏主要卖点函数式编程。

最佳答案

只要 F# 不区分纯代码和不纯代码,我怀疑我们会看到这种优化。但是,您可以使柯里化(Currying)显式化。

let isInSet setElems =
let set = Set.ofList setElems
fun normalize p -> normalize p |> set.Contains
isHtmlSet现在将调用 isInSet只有一次获得闭包,同时执行 ofList .

关于F# 柯里化(Currying)效率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2703802/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com