Преобразовать параметр конструктора в кортеж для использования в сопоставлении с образцом в F # - PullRequest
2 голосов
/ 12 августа 2011

Я прочитал , что F # достаточно умен, чтобы преобразовать параметр метода в кортеж. Например:

let isInt s =
  match System.Int32.TryParse(s) with
  | (false, _) -> false
  | (true, _) -> true

Я хочу создать новый Mutex с уникальным общесистемным именем. Есть конструктор с 3 параметрами:

new: 
    initiallyOwned:bool * 
    name:string * 
    createdNew:bool byref -> Mutex

Последний параметр является выходным параметром, и F # должен иметь возможность преобразовывать результат вызова конструктора в кортеж. Тем не менее следующий код выглядит не скомпилированным с ошибкой " Ожидается, что это выражение будет иметь тип Mutex, но здесь имеет тип 'a *' b "

open System.Threading

let rec CreateUniqueMutex i =
    match new Mutex(false, i.ToString()) with
    | (_, false) -> CreateUniqueMutex (i+1) // Error here
    | (mutex, true) -> mutex

В чем разница с первым isInt методом?

Можно ли исправить мой код?

Какой код будет наиболее подходящим для моей задачи?

1 Ответ

2 голосов
/ 12 августа 2011

Разница в том, что имеется несколько перегрузок конструктора Mutex, поэтому компилятор считает, что вы вызываете перегрузку, которая принимает ровно два аргумента. Лучше всего объявить изменяемый локальный код и использовать это:

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

В качестве второстепенного замечания, обратите внимание, что кортежи в вашем выражении сопоставления задом наперед: возвращаемое значение идет первым, поэтому они должны быть (_,false) и (mutex, true).

...