2013-10-20 84 views
0

我是新來的F#這樣的代碼塊覺得奇怪,我F#做到讓執行順序

let randomTest avgWait avgBusyTime numExp numClients labsRules = 
    let clients, _ = mkClientsAndLabs numClients labsRules 
    doTest [for i in 0..numClients-1 -> randomTestClient clients i avgWait avgBusyTime numExp ] 

do let clients, _ = mkClientsAndLabs 5 [rulesA; rulesB] 
    doTest [scheduledClient clients 0 [(0, 500, A)];  // Request a lab at the very start, use for "A" for 0.5 seconds 
      scheduledClient clients 1 [(200, 300, Mix (Mix (A,Mix (A,A)),B))] ; // Request after 0.2s, release 0.3s later. 

      scheduledClient clients 2 [(300, 200, Mix (A,Mix (A,A)))]; // These three will all be waiting for a lab. 
      scheduledClient clients 3 [(400, 200, Mix (A,A))];   // Client 2 should include the others as guests. 
      scheduledClient clients 4 [(400, 200, A)] 
      ] 

什麼我不確定是do let聲明 - 這顯然是宣佈後randomTestrandomTest仍然可以調用該功能。這段代碼執行的順序是什麼?

+0

如果有任何答案已解決您的問題,請點擊複選標記考慮[接受它](http://meta.stackexchange.com/q/5234/179419)。這向更廣泛的社區表明,您已經找到了解決方案,併爲答覆者和您自己提供了一些聲譽。沒有義務這樣做。 – Gustavo

回答

3

它的寫法可能會令人困惑。沒有這樣的東西作爲do let聲明。 事實上,它是一個整體do {code}塊與{code}內的let綁定。 這意味着它不是一個函數聲明,do塊只是一個要執行的代碼,它不會聲明函數或值。

應該更容易閱讀這樣的:

do 
    let clients, _ = mkClientsAndLabs 5 [rulesA; rulesB] 
    doTest [scheduledClient clients 0 [(0, 500, A)];  // Request a lab at the very start, use for "A" for 0.5 seconds 
      scheduledClient clients 1 [(200, 300, Mix (Mix (A,Mix (A,A)),B))] ; // Request after 0.2s, release 0.3s later. 

      scheduledClient clients 2 [(300, 200, Mix (A,Mix (A,A)))]; // These three will all be waiting for a lab. 
      scheduledClient clients 3 [(400, 200, Mix (A,A))];   // Client 2 should include the others as guests. 
      scheduledClient clients 4 [(400, 200, A)] 
      ] 

所以執行的順序是先let randomTest ...,那麼do塊。