haskell - 我该如何处理 "Occurs check: cannot construct the infinite type: a0 = [a0]"?

标签 haskell

代码:

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/

相关文章:

haskell - 在 monad 转换器中使用类型同义词

json - 可以使用 GHCI 中的 json 包解析 JSON,但使用 GHC 编译时不行

haskell - 二叉树的 Monad 实例

haskell - 有没有办法让 GHC 提供类型孔的类型类约束?

haskell - Haskell 中的快速数据结构

haskell - cabal : dist/doc/html/creatur/haddock-prolog27972. txt:无效参数

haskell - IO 是免费的 Monad 吗?

haskell - XMonad:如何将Super(Win键)+空格绑定(bind)到键盘布局切换?

string - Haskell::无法将类型 `Char' 与 `[Char]' 匹配

algorithm - 优化大向量的操作