Если разбить его еще немного, проблему легче увидеть.На самом деле, вероятно, это затрудняет присвоение имен.
let company = Company { Name1 = "Foo Bar AG"; Name2 = Some "Baz" } // Person
let company2 = Company { company with Name2 = None } // Person, but broken because expecting company to be type of CorporateEntity
Итак, вы пытаетесь создать CorporateEntity
с типом Person
, которые не совпадают.
Это работает, потому что используется правильный тип.
let c1 : CorporateEntity = { Name1 = "Foo Bar AG"; Name2 = Some "Baz" }
let p1 : Person = Company c1
let c2 : CorporateEntity = { c1 with Name2 = None }
let p2 : Person = Company c2
Я добавил типы и изменил имя, чтобы сделать тип более очевидным.Вы можете match
на этом ...
match company with // <- rename company to person so it is clearer
| Natural _ -> company
| Company c -> Company { c with Name2 = None }
Если вы хотите сопоставить в функции, вы можете сделать это так:
let noCompanyName2 (c:CorporateEntity) = // c:CorporateEntity -> Person
let { Name1 = n1; Name2 = _ } = c
let company3 = Company { Name1 = n1; Name2 = None }
company3
Или более кратко:
let noCompanyName2 ({ Name1 = n1; Name2 = _ }) = Company { Name1 = n1; Name2 = None }
Надеюсь, это поможет.