功能包装问题:X< | fun() - >一个

时间:2011-09-07 08:09:26

标签: f# wrapper

所以我只想问为什么会这样:

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... )

它对我来说看起来一样,但第一个变体作为包装器,我完全无法理解第二个变体是如何工作的。

2 个答案:

答案 0 :(得分:2)

我认为令人困惑的是,在第二个版本中,变量A只是unit。 F#编译器推断这是因为您从用作A的函数返回thth的类型是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();) )