我正在编写一些代码来生成大量随机值并将它们添加到结构中,并且我需要一种机制来链接相同的 IO 操作。所以,我写了这个:
chain :: Monad m => Int -> (a -> m a) -> a -> m a
chain 0 _ a = return a
chain n f a = f =<< chain (n-1) f a
我怀疑这应该在某个库中的某个地方,但我在 Control.Monad 中找不到它。这个函数已经写好了吗?有没有更简单的方法来做到这一点?
如果我要提议一个库来放入它,我会建议添加Semigroup
and Monoid
以下新类型的实例:
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
import Control.Monad
import GHC.Prim (coerce)
newtype KleisliEndo m a = KE { runKE :: a -> m a }
instance Monad m => Monoid (KleisliEndo m a) where
mempty = coerce (return @m @a)
mappend = coerce ((>=>) @m @a @a @a)
Then stimesMonoid https://hackage.haskell.org/package/base-4.9.0.0/docs/Data-Semigroup.html#v:stimesMonoid是你的操作。
如果得知这种新类型确实也存在于某个图书馆中,我不会感到惊讶。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)