对于OCaml的记录,是否有类似于JavaScript的传播运算符?



我想知道OCaml是否可以做类似下面的代码(在TypeScript中):

interface User {
name: string
email: string
}
function titi(user: User) {
console.log(user)
}
let u1 = {name: "v2"}
let u2 = {...u1, email: "v2@x.y.z"}
titi(u2)

你的要求并不完全清楚。但OCaml中最接近的构造可能是记录构造函数中的with:

type user = { name : string; email : string }
let user_a = { name = "ua"; email = "e" }
let user_b = { user_a with name = "ub" }

(在OCaml中,你必须构造一个完整的记录值,你不能只有一个字段。)

作为对Jeffrey的回答的补充,如果您有一个带有使用记录的构造函数的变体类型,事情会变得稍微有趣一些,但您仍然可以使用它。

行不通:

type user = User of { name : string; email : string }
let user_a = User { name="ua"; email="e" }
let user_b = User { user_a with name="ub" }

但是,如果对值的记录部分进行模式匹配,则可以:

let user_a = User { name="ua"; email="e" }
let user_b = 
match user_a with
| User r -> User { r with name="ub" }

我们可以使用as关键字对记录的组件进行模式匹配:

let user_a = User { name="ua"; email="e" }
let user_b = 
match user_a with
| User ({name=n; _} as r) -> User { r with name=n^"2" }

当然,当使用单一模式的match时,我们可以只使用本地绑定。

let user_a = User { name="ua"; email="e" }
let user_b = 
let User ({name=n; _} as r) = user_a in
User { r with name=n^"2" }

最新更新