我是F#的新手。我有一个执行某些数据库操作的功能。我正在努力返回结果。
let funcA () =
let funcB () =
// do some database operation and returns seq of records
let funcC () =
// do some other database operation returns nothing
let result = funcB ()
funcC ()
如何从result
返回funcA
?我需要在funcB
funcC
答案 0 :(得分:4)
函数的最后一行应该是您的返回值。在您的情况下,您不一定需要在此处嵌套函数,但是我们可以将其保留不变。另外,必须注意,F#默认情况下是一种急切评估的语言,因此,如果您定义的函数没有任何参数,它们实际上将在前面进行评估(并且不会随以后的执行而改变)。如果您的功能实际上不需要任何参数,请提供一个unit
值作为参数。
let funcA () = // Function defintion
代替
let funcA = // Function definition
let funcA () =
let funcB () =
// Perform database operation
let funcC () =
// Perform some side-effect, returns ()
let result = funcB ()
funcC ()
result // This will be your return value
let a = funcA () // Example usage
答案 1 :(得分:0)
可接受的答案很好用,但是不是很尖锐
如果您的funcC只能在funcB之后执行,则可以通过使用funcB的结果类型作为funcC的输入来使其更加明确。甚至更好,使用铁路模式:
let funcA () =
let funcB () : Result<Seq<Foo>, string> =
// perform database operation, return Ok <| sequence of Foo if successful
// otherwise Error <| "sql failed"
let funcC x =
// perforn some side effect
x //return input
funcB ()
|> Result.map funcC
(See Scott Wlaschins excellent posts about railway oriented programming)