2017-05-27 17 views
1

私は主にC#で動作し、F#/関数言語の新バージョンであり、かなりシンプルなプログラムに問題があります。 私は2つの整数フィールドを持つレコードを作成する関数を持っています。フィールドは、System.Random.NextDoublematchの範囲内で選択され、特定の確率と揃う。私はその後、createCustomer関数を4回実行するべきforループを持っています。F#forループ内のレコードを返す呼び出し関数

私がいる問題はCustomerは、forループの全10回の反復とgetIATimeの内部printfn一度だけ実行するようでも同じであるということです。

Program.fs

open Simulation 

[<EntryPoint>] 
let main argv = 
    printfn "%A" argv 
    printfn "Test" 

    for i in 1 .. 10 do 
     let mutable customer = createCustomer 
     printfn "i: %d\tIA: %d\tService: %d" i customer.interArrivalTime customer.serviceTime 


    ignore (System.Console.ReadLine()) //Wait for keypress @ the end 
    0 // return an integer exit code 

Simulation.fs

module Simulation 

type Customer = { 
    interArrivalTime: int 
    serviceTime: int 
} 

let createCustomer = 
    let getRand = 
     let random = new System.Random() 
     fun() -> random.NextDouble() 

    let getIATime rand = 
     printf "Random was: %f\n" rand 
     match rand with 
     | rand when rand <= 0.09 -> 0 
     | rand when rand <= 0.26 -> 1 
     | rand when rand <= 0.53 -> 2 
     | rand when rand <= 0.73 -> 3 
     | rand when rand <= 0.88 -> 4 
     | rand when rand <= 1.0 -> 5 

    let getServiceTime rand = 
     match rand with 
     | rand when rand <= 0.2 -> 1 
     | rand when rand <= 0.6 -> 2 
     | rand when rand <= 0.88 -> 3 
     | rand when rand <= 1.0 -> 4 

    {interArrivalTime = getIATime (getRand()); serviceTime = getServiceTime (getRand())} 
+1

。この場合、C#と同じです。 C#でループ内に変数を宣言する場合は、同じ変数ではなくループの繰り返しごとに新しい変数になります。 –

+0

よろしくお願いします。私はそれが私が持っていた問題を修正したかどうかを確認するためにそれを追加しようとしました – WereGoingOcean

+0

あなたがコードのレビューをするつもりならば、 'match'の悪用もあります。 –

答えて

4

あなたgetCustomerは関数ではありませんが、。その本体はプログラムの初期化中に一度だけ実行され、その結果はフィールドに格納され、その後にアクセスすることができます。関数を "呼び出す"と考えると、実際には値を参照するだけです。電話をする機会がないので、電話をしていません。

getCustomerを関数にするには、パラメータを指定します。これは、関数がF#の値とどのように異なるかです。パラメータがある場合は関数です。そうでない場合 - あなたは価値です。関数に渡す実際のデータはないので、unitの "ダミー"( "プレースホルダー")パラメーターを与えることができます。このタイプは、1つの値を持ち、その値は()のように書かれている。そして、

let createCustomer() = 
    let getRand = 
     let random = new System.Random() 
     fun() -> random.NextDouble() 

    ... 

このようにそれを呼び出す:あなたがループ内で「可変」キーワードことを必要としない

for i in 1 .. 10 do 
    let mutable customer = createCustomer() 
    printfn "i: %d\tIA: %d\tService: %d" i customer.interArrivalTime customer.serviceTime 
+0

それは私の問題でした。私は終わりに 'fun() - > {...}'を置くことになり、 'System.Random()'がループごとに作成されるのを止めました。ありがとう! – WereGoingOcean

+1

関数は明示的なパラメータなしで宣言することができますが、呼び出すときには少なくとも1つのパラメータを指定する必要があります。技術的には、それらが関数を含む値であると私は思う。これはF#ではむしろ一般的であり、初心者のための混乱の原因となる可能性があります。 –

関連する問題