Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 将构造函数的参数转换为元组以用于F中的模式匹配#_F#_Pattern Matching - Fatal编程技术网

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 -

我认为F#足够聪明,可以将方法的参数转换为元组。例如:

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")