在F#中使用较小的试用块?

kno*_*cte 3 f# try-catch immutability c#-to-f#

所以我有这段代码,我想在其中添加一个try-with块:

static member private SomeFunc
    (someParam: list<DateTime*int>) =

    let someLocalVar = helpers.someOtherFunc someParam

    let theImportantLocalVar =
        List.fold
            helpers.someFoldFunc
            ([],someLocalVar.First())
            someLocalVar.Tail

    let first = fst theImportantLocalVar

    let tail = someParam.Tail

    helpers.someLastFunc(first,tail,theImportantLocalVar)
Run Code Online (Sandbox Code Playgroud)

我想添加的try-with块应该只是将调用包装起来List.fold,但是如果我只包装该行,那么我以后就无法访问该变量theImportantLocalVar.

现在,作为一种解决方法,我已经将try-with块包装整个函数体(除了关于赋值的第一行除外someLocalVar),但我想避免这种情况:

static member private SomeFunc
    (someParam: list<DateTime*int>) =

    let someLocalVar = helpers.someOtherFunc someParam

    try
        let theImportantLocalVar =
            List.fold
                helpers.someFoldFunc
                ([],someLocalVar.First())
                someLocalVar.Tail

        let first = fst theImportantLocalVar

        let tail = someParam.Tail

        helpers.someLastFunc(first,tail,theImportantLocalVar)

    with
    | BadData(_) -> raise (new
        ArgumentException("output values can only increase: " + someLocalVar,
                          "someParam"))
Run Code Online (Sandbox Code Playgroud)

在C#中,我会用bool异常= false解决它,我会转到truecatch块内部(稍后在函数的第二部分查询它),或者初始化theImportantLocalVar为null以便稍后进行比较; 但是,在F#中,我需要mutable关键字,这是不鼓励的.

那么如何在不使用可变变量的情况下做到这一点呢?

Dan*_*iel 5

try/ with是一个表达式,所以你可以这样做:

let theImportantLocalVar =
    try
        List.fold
            helpers.someFoldFunc
            ([],someLocalVar.First())
            someLocalVar.Tail
    with
    | BadData(_) -> raise (new
        ArgumentException("output values can only increase: " + someLocalVar,
                          "someParam"))
Run Code Online (Sandbox Code Playgroud)