2014-09-28 34 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