首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >F#如何保留lazy /copy非强制lazy语句

F#如何保留lazy /copy非强制lazy语句
EN

Stack Overflow用户
提问于 2019-04-01 17:38:44
回答 1查看 148关注 0票数 1

下面的输出是15,9,9,但是我想要15,9,21我想保留一个懒惰的版本,这样我就可以在组合函数中放入一个新的函数版本。

代码语言:javascript
运行
复制
open System
let mutable add2  = fun x-> x+2
let mutable mult3 = fun x-> x*3
let mutable co = add2 >> mult3
let mutable com = lazy( add2 >> mult3)
let mutable com2 = com

add2<- fun x-> x
co 3|> printfn "%A"
com.Force() 3|> printfn "%A"
add2<- fun x-> x+4
com2.Force() 3|> printfn "%A"
EN

回答 1

Stack Overflow用户

发布于 2019-04-02 05:09:12

我不认为这里需要惰性值--惰性值在需要时只计算一次,但它的值在需要后不会改变。在您的示例中,您需要Force重新计算该值,以防某些依赖项发生更改。您可以定义如下内容:

代码语言:javascript
运行
复制
type Delayed<'T> = 
  | Delayed of (unit -> 'T)
  member x.Force() = let (Delayed f) = x in f()

let delay f = Delayed f

它使用Force方法表示一个延迟值(实际上,只是一个函数),该方法将在每次访问它时对其求值。如果你使用delay重写你的代码,它会按照你想要的那样运行:

代码语言:javascript
运行
复制
let mutable add2 = fun x-> x+2
let mutable mult3 = fun x-> x*3
let mutable com = delay(fun () -> add2 >> mult3)
let mutable com2 = com

add2 <- fun x -> x
com.Force() 3 |> printfn "%A"
add2 <- fun x -> x + 4
com2.Force() 3 |> printfn "%A"

与lazy不同的是,它不做任何缓存,所以调用两次Force只会做两次。您可以通过跟踪计算的依赖关系图来添加一些缓存,但这会变得更加复杂。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55452066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档