单次计算N次

我正在实现一个函数来执行单次计算N次。 我写了下面的代码。

performN :: Monad m => Int -> m t -> m [t]
performN 0 m = return []
performN n m = 
  do x1<- m
     x2<- if n == 1 then return [] else (m:performN (n-2) m)
     return (x1:x2)

我收到以下错误。

:264:44:错误:
•无法将类型“m”与“[]”匹配
'm'是一个刚性类型变量
类型签名为:
performN :: forall(m :: * - > *)t。 Monad m => Int - > mt - > m [t]
在:260:13
预期类型:[mt]
实际类型:m [t]
•在'(:)'的第二个参数中,即'performN(n-2)m'
在表达式中:(m:performN(n-2)m)
在“do”块的标记中:
x2 < - 如果n == 1,则返回[] else(m:performN(n - 2)m)
•相关绑定包括
m :: mt(界限:262:12)
performN :: Int - > mt - > m [t](bound at:261:1)

我似乎无法弄清楚我做错了什么,以及如何解决它。


你已经做了零次正确的事情。

performN :: Monad m => Int -> m t -> m [t]
performN 0 m = return []

你有第一部分做了n次正确的事情:做一次。

performN n m = do
  x1 <- m

但是,你所要做的就是多做n - 1次。 不奇怪if东西。

performN n m = do
  x1 <- m
  x2 <- performN (n - 1) m
  return (x1 : x2)

太多东西。 n == 1n-2 ? 为什么? 简单!

performN :: Monad m => Int -> m t -> m [t]
performN 0 _ = return []
performN n m =
  do x  <- m
     xs <- performN (n-1) m
     return $ x:xs

如果你需要使用这个函数,而不是需要实践它,你应该使用Control.Monad.replicateM而不是自己重新实现它。

链接地址: http://www.djcxy.com/p/43045.html

上一篇: Perform Monadic Computation N times

下一篇: Haskell GADT 'Show'