Haskell中seqn函数编译报错求助:代码与错误分析
Haskell seqn函数编译错误分析与修正
你写的seqn函数代码:
seqn [] = return [] seqn (act:acts) = do x <- act xs <- seqn acts return (x::xs)
GHCi给出的错误信息:
seqn.hs:4:30: error: • Couldn't match expected type ‘xs’ with actual type ‘a’ ‘xs’ is a rigid type variable bound by an expression type signature: forall xs. xs at seqn.hs:4:33-34 ‘a’ is a rigid type variable bound by the inferred type of seqn :: Monad m => [m a] -> m [a1] at seqn.hs:(1,1)-(4,35) • In the first argument of ‘return’, namely ‘(x :: xs)’ In a stmt of a 'do' block: return (x :: xs) In the expression: do x <- act xs <- seqn acts return (x :: xs) • Relevant bindings include x :: a (bound at seqn.hs:2:22) acts :: [m a] (bound at seqn.hs:2:11) act :: m a (bound at seqn.hs:2:7) seqn :: [m a] -> m [a1] (bound at seqn.hs:1:1) | 4 | return (x::xs) | ^ Failed, no modules loaded.
问题原因
错误根源在最后一行的x::xs:Haskell里::是类型标注运算符,用来指定表达式的类型;而你实际需要的是列表构造符:(单个冒号),用来把元素x添加到列表xs的头部。你误把单个冒号写成了双冒号,导致GHC将xs解析成一个类型变量,而非之前通过xs <- seqn acts绑定的列表值,从而触发类型不匹配的错误。
修正方案
把x::xs改成x:xs即可,修正后的完整代码:
seqn [] = return [] seqn (act:acts) = do x <- act xs <- seqn acts return (x:xs)
修正后,函数逻辑符合预期:递归处理动作列表,先执行当前动作得到结果x,再递归处理剩余动作得到结果列表xs,最后将x前置到xs并通过return包装为Monad类型的值,类型签名会被正确推导为seqn :: Monad m => [m a] -> m [a]。
内容的提问来源于stack exchange,提问作者Gergely
相关产品推荐
相关产品推荐

