[英]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.