从函数F#返回数据

时间:2019-04-23 19:57:32

标签: f#

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

2 个答案:

答案 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