我想知道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" }