所以我只想问为什么会这样:
let internal X th =
foo()
th()
bar()
let Start() =
X <| fun () -> ( foo(); bar(); etc... )
这不起作用:
let internal XD A =
let X th =
foo()
th()
bar()
(X <| fun () -> A)
let Start() =
XD ( foo(); bar(); etc... )
它对我来说看起来一样,但第一个变体作为包装器,我完全无法理解第二个变体是如何工作的。
答案 0 :(得分:2)
我认为令人困惑的是,在第二个版本中,变量A
只是unit
。 F#编译器推断这是因为您从用作A
的函数返回th
而th
的类型是unit -> unit
。这意味着在加入foo
之前Start
会调用XD
。
然而,要说出你期望的结果有点困难。您是否希望将foo
作为函数传递给XD
,而不是立即调用它?如果是,那么你需要:
let internal XD A =
let X th =
foo()
th()
bar()
(X <| fun () -> A()) // Change: Call A with unit argument: 'A ()'
XD foo // Change: Pass a function instead of calling it
答案 1 :(得分:1)
以下是您想要实现的第二版的正确代码(没有使用延迟值的lambda)。
let internal XD (A:Lazy<unit>) =
let X th =
foo()
th()
bar()
X <| (fun () -> A.Force())
let Start() =
XD ( lazy(foo(); bar();) )