我怎样才能处理"发生检查:无法构造无限类型:a0 = [a0]"?

Bil*_*nde 2 haskell

码:

myperms [] = [[]]
myperms xs = [a:ys| a<-xs, ys<-(delete a xs)]
Run Code Online (Sandbox Code Playgroud)

我收到这个错误:

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)]
Run Code Online (Sandbox Code Playgroud)

我想不出这个错误.有人可以向我解释如何处理这些情况,以免出错并编写更好的代码吗?提前致谢.

baz*_*rgh 5

@bheklilr已经解释了你的代码中的错误,但你问:"有人可以向我解释如何处理这些情况,以免出错并编写更好的代码吗?"

我建议添加类型签名.

myperms :: [a] -> [[a]]
myperms [] = [[]]
myperms xs = [a:ys| a<-xs, ys<-(delete a xs)]
Run Code Online (Sandbox Code Playgroud)

它有时有助于从代码中完全消除所有的通用性,例如:

myperms :: [Int] -> [[Int]]
myperms [] = [[]]
myperms xs = [a:ys| a<-xs, ys<-(delete a xs)]
Run Code Online (Sandbox Code Playgroud)

如果仍然无法看到错误,把它分解成更小的功能,并给他们类型签名:

genys:: Int->[Int]->[[Int]] -- I know this is wrong, that's the point
genys a xs=delete a xs
Run Code Online (Sandbox Code Playgroud)

修复代码后,通常可以删除此脚手架.现在您将有一个更具体的错误,关于更具体的代码,您应该能够解决您的问题.

在编写实现之前编写类型签名是个好主意,它在早期就会发现很多错误.它还可以帮助澄清您对每个功能正在尝试做什么的思考.作为奖励,您可以在hoogle中查找您的类型签名,可能有一个您可以使用的实现.