Порядок аргументов и оператор вертикальной черты

Есть ли способ упростить следующее, чтобы мне не нужна была функция 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

person GregC    schedule 29.11.2010    source источник
comment
Боюсь, непонятно, о чем вы спрашиваете. Вас интересует самый чистый способ написать let processOneItem item = Async.RunSynchronously(fetchAction item, 2000)?   -  person J Cooper    schedule 30.11.2010


Ответы (3)


Возможно, вы имеете в виду что-то вроде этого:

let processOneItem item =
  fetchAction item
  |> fun x -> Async.RunSynchronously(x, 2000)
person J D    schedule 29.11.2010

Я не очень заинтересован в использовании fun x -> ... как части конвейера.

Я думаю, что конвейерный стиль написания кода хорош, когда он поддерживается API (например, списки), но когда API не соответствует стилю, лучше просто следовать обычному стилю, похожему на C#. Конечно, это всего лишь личное предпочтение, но я бы просто написал:

let processOneItem item =  
  let work = Async.Catch(fetchAction item)
  let result = Async.RunSynchronously(work, 30000)
  handleExceptions result
person Tomas Petricek    schedule 30.11.2010

Вот более полный образец для дальнейшего использования:

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