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关键字,这是不鼓励的.
那么如何在不使用可变变量的情况下做到这一点呢?
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)