簡體   English   中英

警衛的初學者錯誤? -哈斯克爾

[英]Beginner error with guards? - Haskell

我剛開始從事第三次學校作業,卻遇到了另一個新手錯誤,我似乎無法自行解決。

我們要編寫一個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個元素的列表。

在過去的五個星期中,我才剛剛開始學習如何編程,所以請多多包涵。 :)我不確定我是否已正確使用。 我在編譯時遇到的錯誤在上述代碼的最后一行。

謝謝!

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

您在那里需要一個等號 ,而不是compares_equal號。 您的警戒表達式中還會有一個額外的$ 它應該是

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)    

沒有警衛。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM