2013-10-20 2 views
0

나는 F 번호에 이렇게 코드 블록은 내가 확실하지 오전하는 것은 do let 선언입니다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)] 
      ] 

나에게 이상한 새로운 것있어 - randomTest 아직 randomTest 여전히 호출 할 수 있습니다 후가 분명히 선언 그 기능. 이 코드 실행의 순서는 무엇입니까?

+0

질문에 대한 답이 있으면 [확인] (http://meta.stackexchange.com/q/5234/179419)을 클릭하여 확인하십시오. 이는 해결책을 찾았고 응답자와 자신에게 어느 정도의 평판을 제공한다는 것을 더 넓은 커뮤니티에 나타냅니다. 이를 수행 할 의무는 없습니다. – Gustavo

답변

3

작성 방법이 혼란 스러울 수 있습니다. do let 선언문은 없습니다. 사실 {code} 안에 let 바인딩이있는 전체 do {code} 블록입니다. 즉, 함수 선언이 아니며 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 블록입니다.