我正在实现一个函数来执行一个单子计算N次。我已经编写了以下代码。
我收到了以下错误信息。
• 264:44: 错误:
• 无法匹配类型 'm' 和 '[]'
'm' 是一个刚性类型变量,受到以下类型签名的限制:
performN :: forall (m :: * -> *) t. Monad m => Int -> m t -> m [t]
at :260:13
期望类型:[m t]
实际类型:m [t]
• 在 '(:)' 的第二个参数中,它是 'performN (n - 2) m'
在表达式中:(m : performN (n - 2) m)
在 'do' 块的语句中:
x2 <- if n == 1 then return [] else (m : performN (n - 2) m)
• 相关绑定包括
m :: m t(在 :262:12 绑定)
performN :: Int -> m t -> m [t](在 :261:1 绑定) 我似乎无法弄清楚我做错了什么以及如何修复它。
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 -> m t -> m [t]
at :260:13
期望类型:[m t]
实际类型:m [t]
• 在 '(:)' 的第二个参数中,它是 'performN (n - 2) m'
在表达式中:(m : performN (n - 2) m)
在 'do' 块的语句中:
x2 <- if n == 1 then return [] else (m : performN (n - 2) m)
• 相关绑定包括
m :: m t(在 :262:12 绑定)
performN :: Int -> m t -> m [t](在 :261:1 绑定) 我似乎无法弄清楚我做错了什么以及如何修复它。
performN n-2 m
应该是(performN n) - (2 m)
,而不是performN (n - 2) m
。修正后,您可能想要删除m:
部分并改为减去一。虽然我猜您只是在练习,但这实际上是replicateM
。 - undefined