2015-04-18 59 views
-1

我想制定一個程序,以確定8x8棋盤的位置是否安全,如果將2個皇后放在棋盤上,可以放置騎士。錯誤:除以零(Haskell)

函數的輸入是[0, 0, 6, 0, 0, 4, 0, 0],所以它被稱爲knightPlace [0, 0, 6, 0, 0, 4, 0, 0]。所有nonzeros都是皇后。

正如您所看到的,列表中的第3和第6個元素是6和4,這導致皇后位於第3列和第6行第6列和第4行(假設您從0,0開始國際象棋棋盤的左下角)。

我的山口和行檢查爲過濾不錯,但我diagCheck帶來了新的錯誤消息:

knightPlace[0, 0, 6, 0, 0, 4, 0, 0] 
*** Exception: divide by zero 

是否有人可以幫助我嗎?它不應該是0,因爲diagCheck解決了女王和另一個座標的斜率,使之成爲假,因此沒有添加如果斜率== 1或-1

這裏是我使用的代碼:

knightPlace n = makeboard n 
    where 
    makeboard n = [(i + 1,j + 1) | i<-[0..(length n -1)], j<-[0..(length n - 1)], colrowcheck n i j] 
    -- col and row check, if the condition ==FALSE it doesnt get added 
    colrowcheck n i j = and [(n!!(i) == 0) && n!!(k) /=(j+1)| k<-[0..(length n -1)], not(diagcheck n i j k) ] 

    -- diagcheck 
    diagcheck n i j k = ((j+1) - n!!(k)) `div` ((i+ 1) - k) == -1 || ((j+1) - n!!(k)) `div` ((i+1) - k) == 1 
+0

爲了使用'div'作爲中綴函數,你必須把它放在反引號中:'(j - n !!(k))\'div \'(i-k)' – user2407038

+0

哇我沒問題,但現在它說我被零除,我會改變相應的問題 – REALLYANGRYSTUDENT

+0

你應該提出一個新的問題,而不是改變這個問題,所以你不要使答案失效。 –

回答

3

(這回答由OP發佈,在編輯之前的原題。)

這看起來錯:

(j - n!!(k)) div (i - k) == -1 || (j - n!!(k)) div (i - k) == 1 

嘗試增加一些反引號:

(j - n!!(k)) `div` (i - k) == -1 || (j - n!!(k)) `div` (i - k) == 1 

題外話:上面還可以改寫爲

((j - n!!k) `div` (i - k)) `elem` [-1,1] 

回到主題:改善GHC錯誤信息,請嘗試添加一些類型註釋爲你的函數。例如。

knightPlace :: Int -> [(Int,Int)] 
knightPlace n = makeboard n 
    where 
    makeboard n = [(i + 1,j + 1) | i<-[0..(length n -1)], j<-[0..(length n - 1)], colrowcheck n i j] 

    colrowcheck :: [Int] -> Int -> Int -> Bool 
    colrowcheck n i j = and [(n!!(i) == 0) && n!!(k) /=(j+1)| k<-[0..(length n -1)], diagcheck n i j k ] 

    -- diagcheck 
    diagcheck :: [Int] -> Int -> Int -> Int -> Bool 
    diagcheck n i j k = (j - n!!(k)) `div` (i - k) == -1 || (j - n!!(k)) `div` (i - k) == 1 

添加這些類型的註釋允許GHC儘早檢測類型錯誤。在你的原代碼,該代碼段

(j - n!!(k)) div (i-j) == -1 

計算j - n!!k,然後將其視爲接受兩個參數,即divi-j功能。 GHC推斷j - n!!k的功能類型並繼續。 diagcheck中沒有類型錯誤,但只要嘗試使用整數列表而不是函數列表調用diagcheck,它們就會彈出。

+0

添加您的類型註釋使每個功能失敗,我不知道爲什麼,但我認爲其中大多數是因爲: 無法匹配預期類型'[Int]'實際類型'Int' 無法匹配預期類型'[[ a0]'實際類型爲'Int' 什麼是類型[a0] – REALLYANGRYSTUDENT

+0

@REALLYANGRYSTUDENT我將註釋更改爲我認爲正確的註釋。隨意試驗它們,並使用與你的直覺相匹配的東西:如果你知道一個參數是一個整數列表,那麼使用'[Int]'來表示,等等。 – chi

+0

啊我明白了,非常感謝你,我現在明白了 – REALLYANGRYSTUDENT