F# 将构造函数的参数转换为元组以用于F中的模式匹配#
我认为F#足够聪明,可以将方法的参数转换为元组。例如:F# 将构造函数的参数转换为元组以用于F中的模式匹配#,f#,pattern-matching,F#,Pattern Matching,我认为F#足够聪明,可以将方法的参数转换为元组。例如: let isInt s = match System.Int32.TryParse(s) with | (false, _) -> false | (true, _) -> true 我想创建一个具有唯一系统范围名称的新互斥体。有一个具有3个参数的构造函数: new: initiallyOwned:bool * name:string * createdNew:bool byref -
let isInt s =
match System.Int32.TryParse(s) with
| (false, _) -> false
| (true, _) -> true
我想创建一个具有唯一系统范围名称的新互斥体。有一个具有3个参数的构造函数:
new:
initiallyOwned:bool *
name:string *
createdNew:bool byref -> Mutex
最后一个参数是out参数,F#应该能够将构造函数调用结果转换为元组。
尽管如此,以下代码看起来无法编译,错误为“此表达式应具有互斥类型,但此处具有'a*'b'类型”
第一种isInt方法有什么区别
我的代码能修好吗
对于我的任务,什么样的代码看起来最好?不同之处在于
互斥体的构造函数有多个重载,因此编译器认为您调用的重载正好包含两个参数。您最好声明一个可变的局部变量并使用它:
let rec createUniqueMutex i =
let mutable b = false
let mutex = new Mutex(false, string i, &b)
if b then mutex else createUniqueMutex (i+1)
注意,我已经修复了代码中的一些其他问题。特别是,您需要使用let rec
来定义递归函数,并且需要将(i+1)
括起来
编辑
只是为了说明,如果没有重载,这将起作用:
type MyType(x:string, [<System.Runtime.InteropServices.Out>]y:int byref) =
do y <- 3
member __.X = x
let (myT, n) = MyType("test")
键入MyType(x:string,[]y:int byref)=
有没有办法提示编译器使用正好有3个参数的构造函数?@Konstantin-据我所知,这不是(false,
和(true,mutex)
?你知道为什么允许(System.Console.Write:string->unit)(value)
(新的互斥体:bool*string*bool->mutex)(false,i.ToString())
?@Daniel-这是一致的;在TryGetValue的情况下,返回值是表示成功/失败的bool,out参数是值;在互斥体构造函数中,返回值是互斥体,out参数是表示成功/失败的bool。在任何一种情况下,返回值都出现在元组的第一位。
type MyType(x:string, [<System.Runtime.InteropServices.Out>]y:int byref) =
do y <- 3
member __.X = x
let (myT, n) = MyType("test")