代码:
myperms [] = [[]]
myperms xs = [a:ys| a<-xs, ys<-(delete a xs)]
我收到此错误:
project2.hs:66:15:
Occurs check: cannot construct the infinite type: a0 = [a0]
In the second argument of `(:)', namely `ys'
In the expression: a : ys
In the expression: [a : ys | a <- xs, ys <- (delete a xs)]
我想不出这里面有什么错误。有人可以向我解释如何处理这些情况,以免出错并编写更好的代码吗?提前致谢。
最佳答案
@bheklilr 已经解释了您代码中的错误,但您问:“有人可以向我解释如何处理这些情况,以便不出现错误并编写更好的代码吗?” p>
我建议添加类型签名。
myperms :: [a] -> [[a]]
myperms [] = [[]]
myperms xs = [a:ys| a<-xs, ys<-(delete a xs)]
有时,它有助于完全消除代码中的所有通用性,例如:
myperms :: [Int] -> [[Int]]
myperms [] = [[]]
myperms xs = [a:ys| a<-xs, ys<-(delete a xs)]
如果您仍然看不到该错误,请将其分解为更小的函数,并为它们提供类型签名:
genys:: Int->[Int]->[[Int]] -- I know this is wrong, that's the point
genys a xs=delete a xs
一旦代码修复,您通常可以删除这个脚手架。现在您将遇到一个更具体的错误,涉及一段更具体的代码,您应该能够解决您的问题。
在编写实现之前编写类型签名是一个好主意,它会在早期发现很多错误。它还可以帮助您理清对每个功能的真正用途的想法。作为奖励,您可以在 hoogle 中查找您的类型签名。 ,可能已经有一个您可以使用的实现。
关于haskell - 我该如何处理 "Occurs check: cannot construct the infinite type: a0 = [a0]"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22453552/