码:
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)
我想不出这个错误.有人可以向我解释如何处理这些情况,以免出错并编写更好的代码吗?提前致谢.
@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中查找您的类型签名,可能有一个您可以使用的实现.
| 归档时间: |
|
| 查看次数: |
402 次 |
| 最近记录: |