2

我是 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

4

2 回答 2

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
于 2019-04-23T20:01:12.987 回答
0

接受的答案工作正常,但不是很 fsharp-y

如果您的 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

参见 Scott Wlaschins 关于面向铁路编程的优秀帖子

于 2019-04-26T06:14:07.203 回答