2016-09-13 3 views
2

Я пытаюсь изучить F #, но я продолжаю сталкиваться с проблемами. В последнем случае используется async. В приведенном ниже коде я пытаюсь запустить две длительные операции и выполнить вычисление на основе результата, но я получаю сообщение об ошибке «Async не поддерживает оператор +». Я попробовал кастинг и т. Д., Чтобы заставить его работать, но я никуда не гожусь.F # Использование возвращаемых значений от Async

Не могли бы вы объяснить, где я ошибаюсь.

Спасибо.

let SumOfOpFaults = 
    async{ 
     printfn "Getting Sum of Op Faults" 
     return query { 
      for a in AlarmResult do 
      sumBy a.UserFaultTime 
     } 
    } 

let SumOfMcFaults = 
    async{ 
     printfn "Getting Sum of Machine Faults" 
     return query { 
      for a in AlarmResult do 
      sumBy a.MachineFaultTime 
     } 
    } 

[SumOfMcFaults; SumOfOpFaults] 
|> Async.Parallel 
|> Async.RunSynchronously 
|> ignore 

let total = SumOfOpFaults + SumOfMcFaults // <---Error Here 
+7

Почему вы игнорируете результат 'Async.RunSynchronously'? Эта функция вернет вам два параллельных результата в массиве, тогда вы просто добавите элементы вместе нормально ... – TheInnerLight

+0

Привет - абсолютный честный ответ заключается в том, что я не знаю, что я делаю, я все еще изучаю F #. Используя ваши комментарии, я смог отсортировать его так, спасибо - я ценю время. Если бы вы могли опубликовать его в качестве ответа, я могу согласиться. – Chico

ответ

6

SumOfOpFaults определяется как Async<'T>. Он никогда не изменится на 'T, так что вы не сможете использовать + на нем позже.

Async.Parallel превращает любую последовательность вычислений в Async, которая запускает их параллельно и возвращает массив.

Async.RunSynchronously не дает результата по побочным эффектам, а как возвращаемое значение. Поэтому вам просто нужно сделать это:

let total = 
    [SumOfMcFaults; SumOfOpFaults] 
    |> Async.Parallel 
    |> Async.RunSynchronously 
    |> Array.sum 
+0

«так что вы не можете использовать + на нем позже» часть ... оо, я прошу отличить ... но да ... не без каких-либо «трюков» ... как аппликативные функторы или определяющие оператор (+), что берет Async или ... или ... но на самом деле это не очень актуально, хотя ... просто пришлось ... ;-) –

Смежные вопросы