2014-09-28 78 views
1

我剛開始工作在我的第三個作業上,我遇到了另一個noob錯誤,我似乎無法自行解決。守衛初學者錯誤? - 哈斯克爾

我們要編寫一個Sudoku求解器,而且我正在編寫一個函數,它將決定我的Sudoku中的元素是否是正確的類型。它們是Maybe Int類型(Just Int或Nothing)。

下面是代碼中的相關部分:

data Sudoku = Sudoku [[Maybe Int]] 
    deriving (Eq, Show) 

validValue :: Maybe Int -> Bool 
validValue Nothing = True 
validValue (Just n) = True 

checkEveryElement :: Sudoku -> Bool 
checkEveryElement (Sudoku (x:xs)) 
    | and $ map $ validValue $ concat (x:xs) == True 

的獨本身是由9個元素,其中每個元素是它由9個元件自身的列表的列表表示。所以上面列表中的x(總列表的頭部)實際上是9個元素的列表。

我只開始學習如何編程這些過去五週,所以請耐心等待。 :) 我不知道我使用和正確。編譯時得到的錯誤在上述代碼段的最後一行。

謝謝!

編輯:我忘了實際的錯誤...'可能是不正確的縮進或不匹配的括號。'

+0

在警戒表達式中,您使用單個等號指定結果,而不是double。這就是至少這個具體錯誤的原因,ghc只是看到比較,並想知道結果應該是什麼:) – ollanta 2014-09-28 15:15:43

+0

我想你需要一個():(和$ map $ validValue $ concat(x:xs))== True – osager 2014-09-28 15:17:39

+0

爲了擴展@ ollanta的評論,你並不需要'== True':'和'已經評估爲'Bool',所以不需要用'True'來測試相等性。一種解決方案是將'=='更改爲'=',但如果你想對守衛進行痛苦的明確,你可以寫'== True = True'。 – crockeea 2014-09-28 15:17:40

回答

4

您需要一個等於登錄那裏,而不是比較等效標誌。你的警戒表達中還有一個額外的$。它應該是

checkEveryElement :: Sudoku -> Bool 
checkEveryElement (Sudoku (x:xs)) 
-- | and $ map $ validValue $ concat (x:xs) == True 
    | and $ map validValue $ concat (x:xs) = True 
--    ^^^       ^^^ 

但它會一直是True,根據您當前的定義。由於==符號是警衛的所有部分,所以該函數的正文缺失。

和寫作上面的慣用方法就是

checkEveryElement (Sudoku (x:xs)) = 
    -- and $ map validValue $ concat (x:xs) -- or, 
    all validValue  $ concat (x:xs)  

沒有後衛。

+0

謝謝,我很好地解決了我的問題。我喜歡你如何將錯誤的線條放在你的頭頂上,以便清楚我的問題在哪裏。 :-) – Rewbert 2014-09-28 16:09:48

+0

'(x:xs)'的模式在這裏也是不必要的,你可以使用'checkEveryElement(Sudoku puzzle)= all validValue $ concat puzzle' – bheklilr 2014-09-28 16:26:14