相关疑难解决方法(0)

结构上强制执行的自由选择,没有左派分布

这个伟大的免费套餐中有一个很好的免费替代品,它将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)

haskell category-theory abstract-algebra free-monad

14
推荐指数
1
解决办法
269
查看次数