F#中int类型的NaN等效项是什么?

enk*_*nko 2 .net int f# tryparse

在F#中,我可以这样解析一个浮点数:

let tryParseFloat s =
    let ok,f = System.Double.TryParse s
    if ok then f else nan
Run Code Online (Sandbox Code Playgroud)

然后

let parsed = tryParse "123.123"
match parsed with
| nan -> ignore parsed
| _ -> dostuff parsed
Run Code Online (Sandbox Code Playgroud)

如何使用int实现类似的功能?

scr*_*wtp 5

如果要表示F#中不存在值,则可以使用using option方法。这样,您就可以通过类型系统清楚地知道该值可能存在或不存在。因此,您绝对应该int option在这里使用。

float option出于同样的原因,我强烈建议您也使用NaN代替NaN。

尽管NaN是.NET中浮点数的完全有效值,但在F#类型系统中有点像凹痕。特别nan = nan是,它是错误的,它对于带有NaN的复杂F#类型(如区分的联合和记录)的结构比较不能很好地发挥作用。您会发现可能很难追踪的错误。如果通过数值运算得到NaN是不可避免的,但是比起使用它们来表示缺少值,您可以做得更好。

因此,请遵循@FuleSnabel的建议ints,并将以下内容用于floats

let tryParseFloat s =
    let ok, f = System.Double.TryParse s
    if ok then Some f else None
Run Code Online (Sandbox Code Playgroud)

编辑:实际上,您发布的代码不太起作用,部分原因是上述原因。

 match parsed with
 | nan -> ignore parsed
 | _ -> dostuff parsed
Run Code Online (Sandbox Code Playgroud)

在这里,您无需检查NaN,而是绑定parsed到名为的值nan,并且第二种情况将永远不会被击中(warning FS0026: This rule will never be matched)。

更好的尝试是这样的:

 match parsed with
 | f when f = nan -> ignore parsed
 | _ -> dostuff parsed 
Run Code Online (Sandbox Code Playgroud)

但这里的第一种情况下绝不会受到较大冲击,因为正如我刚才上面写的,f永远不等于nan(即使parsedNaN

您需要使用Double.IsNaN以检查NaN:

 match parsed with
 | f when System.Double.IsNaN(f) -> ignore parsed
 | _ -> dostuff parsed 
Run Code Online (Sandbox Code Playgroud)

但这只是表明,这并不是一个好主意。

tl; dr: NaN对您有害。