我正在使用F#和JSON数据存储,并使用JSON.NET库。我试图在可能的情况下使用F#结构和类型,并遇到以下问题。假设我希望存储以下数据结构,
type A = {
id : int
name : string
posts : string list
}
创建工作正常,但要仅更新存储的name
字段,我需要发送省略posts
字段的JSON记录。使用空列表将不起作用,因为持久性系统将假定我希望用空列表替换现有帖子,从而覆盖它们。从JSON.NET docs我读过,通过将字段设置为null
,
let updatedEntry = { id : 0, name : "Fred", posts = null }
然而,F#编译器会给出一个错误,指出list
类型不能设置为null
。无论如何要在F#中实现这一点,也许是一个我不知道的属性?感谢
答案 0 :(得分:4)
有两种方法可以轻松完成此任务:
使用System.Collections.Generic.List类型,该类型可以为null:
> type A = {id: int; name:string; posts: System.Collections.Generic.List<string> };;
type A =
{id: int;
name: string;
posts: System.Collections.Generic.List<string>;}
> let a = {id=5; name="hello"; posts=null};;
val a : A = {id = 5;
name = "hello";
posts = null;}
另一种更惯用的方式是使用选项类型:
> type A = {id: int; name:string; posts: string list option };;
type A =
{id: int;
name: string;
posts: string list option;}
> let a = {id=5; name="there"; posts=None};;
val a : A = {id = 5;
name = "there";
posts = null;}
请注意,您要将posts
成员与None
进行比较,而不是null
。
方便阅读:Option types
修改强>
(经过一些搜索和实验)你可以使用拳击仍然使用F#类型作为值:
> type A = {id: int; name:string; posts: System.Object };;
type A =
{id: int;
name: string;
posts: Object;}
> let a = {id=5; name="foo"; posts=null};;
val a : A = {id = 5;
name = "foo";
posts = null;}
> let b = {id=6; name="bar"; posts=(box [])};;
val b : A = {id = 6;
name = "bar";
posts = [];}
但我坚持使用Option类型,个人