如何将string转换为Phone结构体的voption类型?
私有结构体Phone转voption的正确实现
你的代码报错核心是两个问题:一是用错了ValueOption.toObj函数,二是忽略了Phone是私有构造的结构体,外部无法直接创建实例。
错误原因拆解
ValueOption.toObj的作用是把值选项(voption)转成.NET对象(ValueNone对应null),而不是把字符串转成voption。你给它传了字符串,自然会出现类型不匹配的错误。另外,Phone的构造器是私有的,你没法在外部直接写Phone "123"来创建实例。
正确实现步骤
1. 给Phone模块添加公开的构造函数
因为Phone是私有构造,必须在定义它的模块里提供公开的创建入口,还可以顺便做格式验证(这也是私有构造的意义之一):
module Phone = [<Struct>] type Phone = private Phone of string // 带验证的创建函数,不符合规则返回ValueNone let create (phoneStr: string) : Phone voption = // 示例验证:非空且长度为11(可根据实际需求修改) if not (String.IsNullOrEmpty(phoneStr)) && phoneStr.Length = 11 then ValueSome (Phone phoneStr) else ValueNone
2. 调用构造函数完成转换
在外部代码里直接调用这个create函数,就能把字符串转成Phone voption:
let testPhone = Phone.create "13800138000" // 返回ValueSome(Phone) let invalidPhone = Phone.create "123" // 返回ValueNone
若不需要验证的简化版
如果只是单纯包装字符串(不推荐,私有构造就是为了约束合法性),也可以写一个直接包装的函数:
module Phone = [<Struct>] type Phone = private Phone of string let ofString (s: string) = ValueSome (Phone s)
外部调用Phone.ofString "xxx"就能得到Phone voption。
内容的提问来源于stack exchange,提问作者gistorx
相关产品推荐
相关产品推荐

