例外:Prelude.last:Haskell中的空列表解决了8个皇后?

Yas*_*deh 1 haskell functional-programming n-queens

我正在使用基本函数解决Haskell中的8-queens问题,
这不是代码:

queens = [[x1,x2,x3,x4,x5,x6,x7,x8]|x1<-[1..8],x2<-[1..8],x3<-[1..8],x4<-[1..8],x5<-[1..8],x6<-[1..8],x7<-[1..8],x8<-[1..8],safeH [x2,x3,x4,x5,x6,x7,x8] x1,safeD [x2,x3,x4,x5,x6,x7,x8] x1 [x1,x2,x3,x4,x5,x6,x7,x8] 1] 
safeH l e = if elem e l then False 
            else if length (l)/=0 then safeH(tail l)(head l) 
                    else True
safeD l e xs n = if last(xs)/=e || length xs == 0 then
                if length(l)/=0 then 
                    if (head(l)+n==e || head(l)-n==e) then False 
                    else safeD(tail l)(e)(xs)(n+1) 
                else safeD(tail xs)(head xs)(tail xs)(1)
            else True
Run Code Online (Sandbox Code Playgroud)

为了澄清SafeH函数检查,没有皇后在同一行H代表Horizantly而SafeD应该检查对角线冲突
我确信该SafeH函数没问题,SafeD
编译代码时它没有问题但是在调用时 它给我这个错误的queens函数
:

[1 of 1] Compiling Main             ( y.hs, interpreted )
Ok, modules loaded: Main.
*Main> queens
*** Exception: Prelude.last: empty list
Run Code Online (Sandbox Code Playgroud)

谁能帮帮我吗??事先感谢每件事:)

Dan*_*ner 5

您可以通过检查xs调用之前的长度来解决紧急问题last:

safeD l e xs n = if length xs == 0 || last(xs)/=e then ...
Run Code Online (Sandbox Code Playgroud)

但是,您将遇到另一个问题,因为您safeD(tail xs)(head xs)(tail xs)(1)then此分支的部分内部调用,并且您可以在then何时到达此分支的一部分length xs == 0.

我强烈建议学习模式匹配(一点点温柔的介绍部分,哈斯克尔报告部分),并努力写出整个代码段而不用调用head,tail,init,last,或length.相反,使用两个模式[]匹配空列表和(x:xs)(或类似)匹配开始x和结束的列表xs; 如有必要,reverse偶尔打一次电话就可以了.

祝你好运,让我们知道你的票价和陷入困境的地方!