如果我有一个通用字段的记录,有没有办法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)
有没有办法获得第一个语法?
不是直接但你可以让你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)
同时,你可以重命名 fmap成withPhoto,如果你喜欢let loadUser = withPhoto download:d
现在可能有点奇怪的是,这个photo部分是任何类型的数据/类型所以我会考虑将这部分重新命名为value- 但这只是我