繁体   English   中英

F# - Int32.TryParse 的部分应用

[英]F# - Partial application of a Int32.TryParse

我试图这样做

let TryParseAnyNumberStyle = Int32.TryParse(style= NumberStyles.Any, privider=CultureInfo.CurrentCulture)

但是编译器抱怨

成员或 object 构造函数“TryParse”不采用 0 个参数。 发现 2 个 arguments 过载。

我能解决它的唯一方法是

  let TryParse numStyle culture (str:string) = 
    match Int32.TryParse(str, numStyle, culture) with
        | true, v -> true, v
        | _ -> false, 0

  let TryParseAnyNumberStyle = TryParse NumberStyles.Any CultureInfo.CurrentCulture

为什么编译器不喜欢我最初的部分应用程序?

请记住,由于您正在调用 static 方法,因此我们不是在讨论部分应用程序,而是在讨论重载决议 关键的区别在于,部分应用程序需要一个 function 和 curried arguments 和至少两个的元数,而重载决议将由编译器对采用元组 ZDBC11CAA5BDA99F77E6FB4DABD882E7 的方法执行。

这是 F# 加法运算符的部分应用的简单示例,将 arity(咖喱参数的数量)从 2 减少到 1:

let add = (+)
// val add : (int -> int -> int)
let add1 = (+) 1
// val add1 : (int -> int)

TryParse方法有两个重载,分别有两个和四个元组 arguments。

public static bool TryParse(string s, out int result)
public static bool TryParse(string s, System.Globalization.NumberStyles style, System.IFormatProvider provider, out int result)

对于out参数,F# 编译器会进行特殊的语法转换,因此您实际上需要提供一个或三个元组 arguments 才能成功解决重载。 通过指定第一个字符串输入参数,您的定义将按预期工作:

open System
open System.Globalization
let tryParseAnyNumberStyle s =
    Int32.TryParse(s, 
        style=NumberStyles.Any, 
        provider=CultureInfo.CurrentCulture )
// val tryParseAnyNumberStyle : s:string -> bool * int

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM