【问题标题】:This expression was expected to have type string,but here has type Gen<string>此表达式应为字符串类型,但此处为 Gen<string> 类型
【发布时间】:2015-11-26 15:04:35
【问题描述】:

我有这个记录:

type Client = 
   { Name : string; Income : int ; YearsInJob : int
     UsesCreditCard : bool;  CriminalRecord : bool }

要为此记录创建生成器,我尝试了以下代码:

let chooseFromList xs =
    gen {
        let! idx = Gen.choose(0, List.length xs - 1)
        return (List.nth xs idx)
    }



let generateName = (Gen.oneof [ gen {return "A"};gen {return "B"};gen {return "C"}])
let generateIncome=  (chooseFromList [0..5000])
let generate_YearsInJob= chooseFromList [0..45]
let generate_UsesCreditCard = (Gen.oneof [ gen { return true }; gen { return false } ])
let generate_UsesCriminalRecord= (Gen.oneof [ gen { return true }; gen { return false } ])



let genertate_Client =
{

      Name= generateName;
      Income=generateIncome;
      YearsInJob=generate_YearsInJob
      UsesCreditCard=generate_UsesCreditCard
      CriminalRecord=generate_UsesCriminalRecord
}

问题在于Name= generateName; 我遇到了错误:

This expression was expected to have type string,but here has type Gen<string> 

这个错误存在于最后一行。

【问题讨论】:

  • 修复名称的类型?或者问它的第一个值?还是用所有东西构建一个字符串?或者也许 OneOf 字符串(而不是生成器,每个生成不同的字符串)?错误就是它所说的:生成器不是字符串。

标签: f# fscheck


【解决方案1】:

由于您想要为您的客户生成一个生成器,您必须首先为您的字段数据生成示例 - 所以gen { ... } 语法会派上用场:

let genertate_Client =
   gen {
      let! name = generateName
      let! income = generateIncome
      let! yearsInJob = generate_YearsInJob
      let! creditCard = genergenerate_UsesCreditCard
      let! criminal = generate_UsesCriminalRecord
      return { 
         Name = name; 
         Income = income;
         YearsInJob = yearsInJob;
         UsesCreditCard = creditCard;
         CriminalRecord = criminal }
   }

当然,您在计算中使用let! 语法从生成器中生成示例

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多