F# 联合类型Union Cases转换函数编译报错如何解决
F# 函数编译错误修复方案
错误根源
- 类型不匹配:
ApprovedWorkTime.ExistingWorkTime联合类型分支要求接收WorkTime类型的入参,你在第一个匹配分支中传入了一个新构造的仅含Start、End字段的记录,由于你定义的三个记录类型字段结构完全一致,编译器将该记录推断为FixedWorkTime类型,和要求的WorkTime类型不匹配,触发报错。 - 语法错误:F# 中构造记录的字段分隔符为分号
;,你使用了逗号,,逗号在F#中用于构造元组,属于语法错误。
修复代码
最简化写法:
let FixWorkTime (workTime: WorkTime) : ApprovedWorkTime = match workTime with // 直接传入原workTime即可,本身就是合法的WorkTime类型 | WorkTime.Workshop _ -> ApprovedWorkTime.ExistingWorkTime workTime | WorkTime.Mounting mounting -> ApprovedWorkTime.FixedWorkTime { Start = mounting.Start; End = mounting.End }
如果需要显式构造对应类型,可以写为:
let FixWorkTime (workTime: WorkTime) : ApprovedWorkTime = match workTime with | WorkTime.Workshop workshop -> ApprovedWorkTime.ExistingWorkTime (WorkTime.Workshop workshop) | WorkTime.Mounting mounting -> ApprovedWorkTime.FixedWorkTime { Start = mounting.Start; End = mounting.End }
内容的提问来源于stack exchange,提问作者Alexander Zeitler
相关产品推荐
相关产品推荐

