【问题标题】:Order of arguments and pipe-right operator参数顺序和管道右运算符
【发布时间】:2010-11-29 21:39:02
【问题描述】:

有没有办法简化以下内容,所以我不需要 runWithTimeout 函数?

let runWithTimeout timeout computation =
   Async.RunSynchronously(computation, timeout)

let processOneItem item =  fetchAction item
                           |> runWithTimeout 2000

编辑: 这就是我需要额外方法的原因:

let processOneItem item =  fetchAction item
                           |> Async.Catch
                           |> runWithTimeout 2000
                           |> handleExceptions

【问题讨论】:

  • 恐怕不清楚你在问什么。你想知道写let processOneItem item = Async.RunSynchronously(fetchAction item, 2000)的最简洁的方式吗?

标签: f# asynchronous .net-4.0 syntactic-sugar


【解决方案1】:

也许你的意思是这样的:

let processOneItem item =
  fetchAction item
  |> fun x -> Async.RunSynchronously(x, 2000)

【讨论】:

    【解决方案2】:

    我不太热衷于将fun x -> ... 用作管道的一部分。

    我认为编写代码的流水线风格在 API 支持时很好(例如列表),但是当 API 不适合这种风格时,最好遵循通常的“C#-like”风格。当然,这只是个人喜好,但我只想写:

    let processOneItem item =  
      let work = Async.Catch(fetchAction item)
      let result = Async.RunSynchronously(work, 30000)
      handleExceptions result
    

    【讨论】:

      【解决方案3】:

      这是一个更完整的示例,以供将来参考:

      let processOneItem item =  fetchAction item
                                 |> Async.Catch
                                 |> fun x -> Async.RunSynchronously(x,30000)
                                 |> handleExceptions
      

      【讨论】:

        猜你喜欢
        • 2015-09-29
        • 2017-10-12
        • 2018-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-29
        • 2023-03-29
        相关资源
        最近更新 更多