jac*_*bsa 1 monads haskell traversable
假设我有一个Futuremonad,soFuture a代表一个a可能可用或尚不可用的。然后sequenceA自动给我语义“等待所有这些 future 准备好并给我所有它们的值”:
sequenceA :: [Future a] -> Future [a]
Run Code Online (Sandbox Code Playgroud)
这类似于逻辑“与”,因为直到所有输入都准备好后它才准备好。进一步深化这个比喻,我们可以定义逻辑或:“用第一个准备好的输入的值来准备好”。
firstReady: [Future a] -> Future a
Run Code Online (Sandbox Code Playgroud)
这个隐喻是否可以推广到其他单子/可遍历对象?此操作有标准名称吗?
该async包公开了Concurrently新类型,该新类型具有一个Alternative引发“返回第一个完成的事情”行为的实例。
该firstReady函数称为asum :: [Concurrently a] -> Concurrently a.
但请注意,它Concurrently没有 monad 实例,因为它不可能满足定律:
m1 <*> m2 = m1 >>= (\x1 -> m2 >>= (\x2 -> return (x1 x2)))
Run Code Online (Sandbox Code Playgroud)
(<*>同时运行其两个参数,但>>=在开始运行第二个参数之前,强制先完全运行其第一个参数。)