这个伟大的免费套餐中有一个很好的免费替代品,它将Functor提升为左派分配.
也就是说,声称是:
runAlt :: Alternative g => (forall x. f x -> g x) -> Alt f a -> g a
Run Code Online (Sandbox Code Playgroud)
是一种替代同态,有liftAlt.事实上,它只是一个,但仅适用于左派分配的替代实例.
当然,实际上,很少有替代实例实际上是左分配的.大多数实际上重要的替代实例(解析器,对于大多数Monad f来说,MaybeT f等)都不是左分配的.这个事实可以通过一个例子来表示,其中runAlt和liftAlt不形成一个Alternative同态:
(writeIORef x False <|> writeIORef True) *> (guard =<< readIORef x)
-- is an IO action that throws an exception
runAlt id $ (liftAlt (writeIORef x False) <|> liftAlt (writeIORef True))
*> liftAlt (guard =<< readIORef x)
-- is …Run Code Online (Sandbox Code Playgroud)