2011-09-07 67 views
1

所以我只想問,爲什麼這個工程:功能包裝的麻煩:X <| fun() ->一個

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

通過不工作,你的意思是邏輯上的結果是不一樣的權利? – Ankur

+0

So foo();酒吧(); etc ...必須在foo()和bar()之前調用。就像我的第一個變體一樣。 – Cynede

回答

1

以下是你想實現什麼(沒有lambda使用懶惰值)第二版的正確的代碼。

let internal XD (A:Lazy<unit>) = 
    let X th = 
     foo() 
     th() 
     bar() 
    X <| (fun() -> A.Force()) 

let Start() = 
    XD (lazy(foo(); bar();)) 
2

我想,令人困惑的是,在你的第二個版本中,變量A只是一個unit。 F#編譯器從這樣的事實推斷出這一點,即您從用作th的函數返回A,並且th的類型爲unit -> unit。這意味着在步入XD之前在Start中被調用。

但是,要分辨出您期望的結果有點困難。您是否想將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 
+0

麻煩是我無法傳遞函數,有兩個函數(或更多)...我會在一秒鐘內編輯問題。 – Cynede

+0

也許我只是不能通過(foo(); bar();等等......),然後在我的函數中從它們中創建一個lambda。 – Cynede

+0

只是我想要環繞(foo(); bar();等等......)而不將它轉換爲lambda,但我不確定這是否可能。 – Cynede