0

私は 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宣言です-それは明らかに後で宣言されrandomTestていrandomTestますが、それでもその関数を呼び出すことができます。このコードの実行順序は?

4

1 に答える 1

3

書き方がややこしいかもしれません。do let宣言のようなものはありません。実際、これは .do {code}内に let バインディングがあるブロック全体{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ブロックです。

于 2013-10-20T06:45:48.547 に答える