我正在实现一个函数来执行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)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误.
:264:44:错误:
•无法将类型'm'与'[]'匹配'
''是一个由
类型签名绑定的刚性类型变量:
performN :: forall(m ::* - >*)t .Monad m => Int - > mt - > m [t]
at:260:13
预期类型:[mt]
实际类型:m [t]
•在'(:)'的第二个参数中,即'performN(n) - 2)m'
在表达式中:(m:performN(n - 2)m)
在'do'块的stmt中:
x2 < - 如果n == 1则返回[] else(m:performN(n - 2) )m)
•相关绑定包括
m :: mt(绑定在:262:12)
performN :: Int - > mt - > m [t](绑定在:261:1)
我似乎无法弄清楚我做错了什么以及如何解决它.
你做了零次正确的事.
performN :: Monad m => Int -> m t -> m [t]
performN 0 m = return []
Run Code Online (Sandbox Code Playgroud)
并且你已经做了n次正确的第一部分:做一次.
performN n m = do
x1 <- m
Run Code Online (Sandbox Code Playgroud)
但是你要做的就是n - 1次.没什么奇怪的if.
performN n m = do
x1 <- m
x2 <- performN (n - 1) m
return (x1 : x2)
Run Code Online (Sandbox Code Playgroud)