3

这是一个片段,它演示了我将要讨论的内容:

open FsCheck
open FsCheck.Gen
open FSharp.Data

type Test = JsonProvider<"""{"collection": [ { "Name": "Rob", "Age": 3 } ] } """>
let testGen () = 
  gen {
       let! name = Arb.generate<string>
       let! age  = Arb.generate<int>
       let colObj = Test.Collection(name, age)
       return Test.Root([|colObj|])
      }

let specialTestGen () = 
  gen {
       let! test = testGen ()
       let item = test.Collection.[0]
       let foo = item.Name
       let changedItem = {item with Name = "Chris"}
       return {test with test.collection = [|changedItem|]}
      }

我正在尝试制作一个具有一些不断生成的字段的生成。我可以将集合实例的名称分配给 foo,但由于某种原因,我无法构造另一个稍微修改过的 stuct 版本。它告诉我 item 没有名为 Name 的属性,当它明显位于它之前的行时,它确实存在。出于某种原因,我可以不使用这些库的“with”语法吗?

4

1 回答 1

4

类型提供程序现在只能提供普通的 .NET 类型,不能提供 F# 记录和可区分联合。该{x with ...}语法仅适用于 F# 记录。

于 2017-07-19T18:46:16.123 回答