我需要在F#中调用bool.TryParse,并且在使用编译器/ Ionide时遇到了一些困难。
Ex。
let value = true
let parsable = bool.TryParse("True", &value)
我在Ionide中看到的VSCode错误如下所示。
val值:bool全名:值
程序集:example3
类型'ByRefKinds.InOut'与类型'ByRefKinds.In'F#不匹配编译器(1)
这是我在F#中使用ref关键字和语法进行调用的第一个示例,所以我不确定自己做错了什么,byrefs文档似乎对理解这一点没有多大帮助特定情况。
事实证明,在我的示例中,我最缺少的是value
不可变,因为在这种情况下调用时必须是可变的。
工作示例:
let value = true
let parsable = bool.TryParse("True", &value)
此解决方案是在我阅读了与slightly related GitHub issue相关的Span<T>
之后又出现在dotnet fsi
中,这至少给了我以下线索。
let parsable = bool.TryParse("True", &value);; -------------------------------------^^^^^^ stdin(34,38): error FS3230: A value defined in a module must be mutable in order to take its address, e.g. 'let mutable x = ...'
但是事实证明,F#在Try-Parse pattern周围似乎也有糖蜜,在进一步研究此示例后,我开始回忆起。这简化为以下调用
bool.TryParse
的替代解决方案。
let value = true let (parsable, _) = bool.TryParse "True"
或者,不必绑定
parsable
并在单个表达式中指定默认值,以下示例可能会更优雅。
let value = match bool.TryParse "True" with | true, value -> value | false, _ -> true
也许调用
bool.TryParse
和其他Try-Parse方法的不同方法各有利弊,但重要的是,我发现一些可行的解决方案,并且由于缺少F#文档,使我摆脱了最初的绊脚石关于这个问题。