当我使用 Hopac 像往常一样或曾经创建Alt<unit>
时,Alt.<functions>
它会导致我产生奇怪的否定确认结果。
但是,如果我async {<expression>}
用来创建,Alt<unit>
那么一切都会按预期进行。
open Hopac
open Hopac.Core
open Hopac.Infixes
open Hopac.Extensions
let pf m (s:int) = Alt.prepareFun <| fun _ ->
Alt.always () ^=> fun _ ->
job {
printfn "starting [%s] %d" m Thread.CurrentThread.ManagedThreadId
Thread.Sleep s
printfn "%s" m }
|> Job.start
let delayedPrintn3 msg delayInMillis =
Alt.prepareFun <| fun _ ->
async {
printfn "starting [%s] %d" msg Thread.CurrentThread.ManagedThreadId
do! Async.Sleep delayInMillis
}
|> Alt.fromAsync
|> Alt.afterFun (fun _ -> printfn "%s" msg)
let na : (string -> int -> Alt<unit>) -> string -> string -> int -> Alt<unit> = fun ff s1 s2 i ->
Alt.withNackJob <|
fun nack ->
nack
|> Alt.afterFun (fun () ->
printfn "%s" s1)
|> Job.start
|> Job.map (fun _ -> ff s2 i)
let na11 = na delayedPrintn3 "1 canceled!!" "na11" 3
let na22 = na delayedPrintn3 "2 canceled!!" "na22" 0
let na33 = na pf "1 canceled!!" "na33" 3
let na44 = na pf "2 canceled!!" "na44" 0
na22 <|> na11 |> run
na33 <|> na44 |> run
结果是:
starting [na22] 18
starting [na11] 18
na22
1 canceled!!
和
starting [na33] 11
na33
但是我想得到相同的结果。使用时有什么问题Alt.<function>
?