首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在bool.TryParse中调用F#

如何在bool.TryParse中调用F#
EN

Stack Overflow用户
提问于 2019-12-09 04:00:12
回答 2查看 575关注 0票数 3

我需要在bool.TryParse中调用F#,我在编译器/ Ionide方面遇到了一些困难。

例如。

代码语言:javascript
复制
let value = true
let parsable = bool.TryParse("True", &value)

我在Ionide中看到的用于VSCode的错误如下所示。 val值: bool全名: value 大会: example3 类型'ByRefKinds.InOut‘不匹配类型'ByRefKinds.In'F#编译器(1)

这是我在F#中使用的第一个用引用关键字和语法调用的示例,所以我不确定我做错了什么,而参考文献文档似乎对理解这个特定场景没有多大帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-09 04:33:09

事实证明,我在示例中遗漏的主要内容是,value不是可变的,因为在此上下文中调用它时需要这样做。

工作实例:

代码语言:javascript
复制
let mutable value = true
let parsable = bool.TryParse("True", &value)

这个解决方案是在我阅读了一个与Span<T>相关的Span<T>之后,然后在dotnet fsi中玩来的,这至少给了我以下的线索。

代码语言:javascript
复制
  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的以下替代解决方案。

代码语言:javascript
复制
let value = true
let (parsable, _) = bool.TryParse "True"

或者,不必绑定parsable并在单个表达式中指定默认值,下面的示例可能更优雅。

代码语言:javascript
复制
let value = match bool.TryParse "True" with
| true, value -> value
| false, _ -> true

也许调用bool.TryParse和其他尝试-分析方法的不同方法有其优缺点,但重要的是,我找到了一些可行的解决方案,并克服了在这个问题上缺乏F#文档的最初绊脚石。

票数 7
EN

Stack Overflow用户

发布于 2019-12-09 20:43:14

正如您已经发现的那样,可以通过使“value”成为可变变量来修复该错误。这么说,您共享的最后一个解决方案(使用模式匹配)看起来是最好和最安全的。

如果您碰巧执行了许多这些解析操作,我建议提取一些实用函数。这将避免错误地对(true,value)而不是(false,value)进行匹配。

样本代码:

代码语言:javascript
复制
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"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59242353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档