2015-01-20 43 views
1
module BirthdayLibrary = 
    type Birthday = 
     { day :int 
      month :int } 

module DataGen = 
    let birthdayGenerator (months:option<list<int>>) = 
     let monthGen = match months with 
         | Some m -> Gen.elements m 
         | None -> FsCheck.Gen.choose(1,12) 
     (fun m d -> { day = d 
         month = m}:BirthdayLibrary.Birthday) 
     <!> monthGen 
     <*> FsCheck.Gen.choose(1,28) 

    //I want this to have the signature Gen<BirthdayLibrary.Birthday list> 
    let oneForEveryMonthGen = 
     [ for m in [1 .. 12] -> 
      (fun mo -> birthdayGenerator (Some [mo]))] 

可以說我有類似上面的東西。我有一個生日發電機,返回類型爲Gen <BirthdayLibrary.Birthday>。您可以選擇指定月份。從代碼<a>到代碼<列表中的最佳方式> WHILE對列表的代碼中的項目指定了一些約束?我可以想辦法獲得<代碼<a>列表>,我認爲這不適合編寫一個父對象,該父對象應該包含<列表>(這是本示例的基礎)。我也可以想辦法做代碼<代碼<a>列表>,我有組成的問題,以及列表中的所有值是相同的。我看到Gen.arrayOf位,我想不出如何讓它與數組中的每個項目的值一起工作。有沒有辦法從Gen <a>到Gen <a list>,同時指定一個綁定?

+0

我會添加一個答案,給你你想要的簽名以及約束,但是我必須承認我不完全理解你在構成問題。 – 2015-01-21 09:46:17

+0

由組合問題我的意思是我無法解開Gen list>以便與具有類型屬性的對象一起使用。 – Hohohodown 2015-01-21 20:29:19

回答

2
module BirthdayLibrary = 
    type Birthday = 
     { day :int 
      month :int } 

module DataGen = 
    let birthdayGenerator (months:option<list<int>>) = 
     let monthGen = match months with 
         | Some m -> Gen.elements m 
         | None -> FsCheck.Gen.choose(1,12) 
     (fun m d -> { day = d 
         month = m}:BirthdayLibrary.Birthday) 
     <!> monthGen 
     <*> FsCheck.Gen.choose(1,28) 

    //I want this to have the signature Gen<BirthdayLibrary.Birthday list> 
    let oneForEveryMonthGen = 
     [ for m in [1 .. 12] -> birthdayGenerator (Some [m])] 
     |> Gen.sequence 

let sample = DataGen.oneForEveryMonthGen |> Gen.sample 10 1 

給我:

VAL樣品:BirthdayLibrary.Birthday列表列表= [[{天= 7; month = 1;}; {day = 15; month = 2;}; {day = 13; month = 3;}; {day = 14; month = 4;}; {day = 28; month = 5;}; {day = 9; month = 6;}; {day = 28; month = 7;}; {day = 15; month = 8;}; {day = 6; month = 9;}; {day = 21; month = 10;}; {day = 12; month = 11;}; {day = 27; month = 12;}]]

相關問題