Generics记录"with"语法

Dax*_*ohl 3 f# functor

如果我有一个通用字段的记录,有没有办法with在更改泛型时模仿方便的语法?

即如果我有

type User<'photo> = // 'photo can be Bitmap or Url
  { first: string; last: string; address: string; phone: string; photo: 'photo }
Run Code Online (Sandbox Code Playgroud)

我希望能够写出类似的东西

let loadUser(user: User<Url>): User<Bitmap> =
  { user with
    photo = download user.photo }
Run Code Online (Sandbox Code Playgroud)

但看起来我必须写这个.

let loadUser(user: User<Url>): User<Bitmap> =
  { first = user.first
    last = user.last
    address = user.address
    phone = user.phone
    photo = download user.photo }
Run Code Online (Sandbox Code Playgroud)

有没有办法获得第一个语法?

Car*_*ten 5

不是直接但你可以让你User成为一个仿函数(对于photo部分):

let fmap (f : 'a -> 'b) (user: User<'a>): User<'b> =
  { first   = user.first
    last    = user.last
    address = user.address
    phone   = user.phone
    photo   = f user.photo }
Run Code Online (Sandbox Code Playgroud)

一次并写(例如):

let loadUser (user : User<Url>) : User<Bitmap> =
    fmap download user
Run Code Online (Sandbox Code Playgroud)

同时,你可以重命名 fmapwithPhoto,如果你喜欢let loadUser = withPhoto download:d

现在可能有点奇怪的是,这个photo部分是任何类型的数据/类型所以我会考虑将这部分重新命名为value- 但这只是我