방금 F #으로 어지럽게 시작했고 언어에 익숙해지기 위해 몇 가지 기본 병렬 계산을 시도하고 있습니다. 유형 불일치에 문제가 있습니다. 다음 예는 다음과 같습니다Async in F in #
let allVariances list =
seq {
for combination in allCombinations list do
yield (combination, abs(targetSum - List.sum combination))
}
let compareVariance tup1 tup2 =
if snd tup1 < snd tup2 then
tup1
else
tup2
let aCompareVariance tup1 tup2 =
async { return compareVariance tup1 tup2 }
let matchSum elements targetSum =
allVariances elements
|> Seq.reduce aCompareVariance
|> Async.Parallel
|> Async.RunSynchronously
그래서, "allVariances 요소"는 서열 <float list * float
을 생산>. CompareVariance는 그 중 두 개를 취하고 더 작은 두 번째 항목 (분산)을 가진 하나를 반환합니다. 내 목표는 Reduce를 사용하여 가장 작은 차이가있는 튜플로 끝나는 것입니다. 그러나 aCompareVariance 인수가 형식이 일치하지 않습니다.
오류 1 형식이 일치하지 않습니다. float -> float list * float -> float list * float -> float list * float -> float list * float -> Async <float list * float
> 'float list * float'유형이 ' 비동기 <float list * float
> '
Reduce에서 비동기 반환 유형을 허용하지 않는 것 같습니다.
나는 감소에 대해 잘못된 생각을 가지고 있었다고 생각합니다. 시퀀스 {a1; a2; a3; a4} : f (f (a1, a2), f (a3, a4))에 대해 이와 같이 작동하기를 바랬습니다. 이렇게 실행되면 f (a1, a2)와 f (a3, a4)가 동시에 실행될 수 있습니다. –
@ user282232 -이 경우에도 가장 바깥 쪽'f'가 이전 축소 단계의 출력에 작용하기 때문에'f'에 대한 입력 및 출력 유형이 일치해야합니다. – kvb
그렇다면 왜 그 유형이 일치하지 않습니까? '는 그것이 다른 스레드에서 왔는지 또는 같은 스레드에서 오는지 여부입니다. –