2013-10-20 46 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块。