单次计算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 == 1
? n-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'