我需要在bool.TryParse中调用F#,我在编译器/ Ionide方面遇到了一些困难。
例如。
let value = true
let parsable = bool.TryParse("True", &value)我在Ionide中看到的用于VSCode的错误如下所示。 val值: bool全名: value 大会: example3 类型'ByRefKinds.InOut‘不匹配类型'ByRefKinds.In'F#编译器(1)
这是我在F#中使用的第一个用引用关键字和语法调用的示例,所以我不确定我做错了什么,而参考文献文档似乎对理解这个特定场景没有多大帮助。
发布于 2019-12-09 04:33:09
事实证明,我在示例中遗漏的主要内容是,value不是可变的,因为在此上下文中调用它时需要这样做。
工作实例:
let mutable value = true
let parsable = bool.TryParse("True", &value)这个解决方案是在我阅读了一个与Span<T>相关的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#似乎在尝试-分析模式周围也有圈套糖,这是我在进一步研究这个示例之后开始回忆的。这将简化为调用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和其他尝试-分析方法的不同方法有其优缺点,但重要的是,我找到了一些可行的解决方案,并克服了在这个问题上缺乏F#文档的最初绊脚石。
发布于 2019-12-09 20:43:14
正如您已经发现的那样,可以通过使“value”成为可变变量来修复该错误。这么说,您共享的最后一个解决方案(使用模式匹配)看起来是最好和最安全的。
如果您碰巧执行了许多这些解析操作,我建议提取一些实用函数。这将避免错误地对(true,value)而不是(false,value)进行匹配。
样本代码:
open System
module Option =
let ofTry<'a> (res:(bool*'a)) : 'a option =
match res with
| true, res -> Some res
| false, _ -> None
module Result =
let ofTry<'a,'b> (err:'b) (res:(bool*'a)) : Result<'a, 'b> =
res
|> csharpToOption
|> Option.toResult err
module Samples =
let withPatternMatch =
match Int32.TryParse "5" with
| true, value -> value |> Some
| false, _ -> None
let withOptionHelper = Int32.TryParse "5" |> Option.ofTry
let withResultHelper = Int32.TryParse "5" |> Result.ofTry "Not a number"https://stackoverflow.com/questions/59242353
复制相似问题