gpt4 book ai didi

f# - 如何在匹配的保护表达式中使用 TryParse?

转载 作者:行者123 更新时间:2023-12-02 02:22:48 26 4
gpt4 key购买 nike

我构建了一个玩具电子表格来帮助学习 F#。当我处理新单元格的文本时,我将其存储为可识别类型。为了解析它,我觉得我应该能够做类似的事情:

        let cv =
match t with
| _ when t.Length=0 -> Empty
| x when t.[0]='=' -> Expr(x)
| x when t.[0]='\"' -> Str(x)
| (true,i) when Int32.TryParse t -> IntValue(i) // nope!
| _ -> Str(t)

我已经尝试了相当多的组合,但我无法将 TryParse 放入防护中。我写了一个助手:

let isInt (s:string) = 
let mutable m:Int64 = 0L
let (b,m) = Int64.TryParse s
b

我现在可以写:

|    _ when Utils.isInt t -> IntValue((int)t)  

这似乎是一个糟糕的解决方案,因为它丢弃了转换后的结果。将 TryParse 纳入防护的正确语法是什么?

最佳答案

我认为active pattern会做你想做的事:

let (|Integer|_|) (str: string) =
let flag, i = Int32.TryParse(str)
if flag then Some i
else None

let cv =
match t with
| _ when t.Length=0 -> Empty
| x when t.[0]='=' -> Expr(x)
| x when t.[0]='\"' -> Str(x)
| Integer i -> IntValue(i)
| _ -> Str(t)

但是如果您确实希望在保护条件下使用 TryParse (并且您不介意解析两次),您可以这样做:

| x when fst (Int32.TryParse(t)) -> IntValue (Int32.Parse(x))

关于f# - 如何在匹配的保护表达式中使用 TryParse?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66174181/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com