List 初级警卫失误哈斯克尔

List 初级警卫失误哈斯克尔,list,haskell,map,concat,List,Haskell,Map,Concat,我刚刚开始做我的第三份学校作业,我又遇到了一个我自己似乎无法解决的noob错误 我们将编写一个数独解算器,我目前正在编写一个函数,它将确定我的数独中的元素是否属于正确的类型。它们的类型可能是Int(只有Int或什么都没有) 以下是代码的相关部分: data Sudoku = Sudoku [[Maybe Int]] deriving (Eq, Show) validValue :: Maybe Int -> Bool validValue Nothing = True validVa

我刚刚开始做我的第三份学校作业,我又遇到了一个我自己似乎无法解决的noob错误

我们将编写一个数独解算器,我目前正在编写一个函数,它将确定我的数独中的元素是否属于正确的类型。它们的类型可能是Int(只有Int或什么都没有)

以下是代码的相关部分:

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个元素的列表

在过去的五周里,我才开始学习如何编程,所以请耐心点。:) 我不确定我是否正确使用了。编译时出现的错误位于上述代码部分的最后一行

谢谢

编辑:我忘记了实际的错误…“可能是不正确的缩进或不匹配的括号。”

这里需要一个等号,而不是等号。在guard表达式中还有一个额外的
$
。应该是

checkEveryElement :: Sudoku -> Bool
checkEveryElement (Sudoku (x:xs))
--  | and $ map $ validValue $ concat (x:xs) == True
    | and $ map   validValue $ concat (x:xs) =  True
--             ^^^                           ^^^
但根据您当前的定义,它始终是
真的
。使用
==
符号表示它是防护装置的一部分,则功能主体缺失

而写上述内容的惯用方式就是

checkEveryElement (Sudoku (x:xs)) = 
  -- and $ map validValue $ concat (x:xs)    -- or, 
     all validValue       $ concat (x:xs)    
没有防护装置。

你需要一个等号,而不是等号。在guard表达式中还有一个额外的
$
。应该是

checkEveryElement :: Sudoku -> Bool
checkEveryElement (Sudoku (x:xs))
--  | and $ map $ validValue $ concat (x:xs) == True
    | and $ map   validValue $ concat (x:xs) =  True
--             ^^^                           ^^^
但根据您当前的定义,它始终是
真的
。使用
==
符号表示它是防护装置的一部分,则功能主体缺失

而写上述内容的惯用方式就是

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

不带保护。

在保护表达式中,用一个等号而不是双等号指定结果。这就是那个特定错误的原因,至少,ghc只是看到了比较,并想知道结果应该是什么:)我想你需要一个():(和$map$validValue$concat(x:xs))==TrueTo展开@ollanta的评论,你不需要严格地使用
==True
:and'将已经计算为
Bool
,因此,不需要使用
True
测试等式。一种解决方案是将
=
更改为
=
,但如果您想痛苦地明确说明防护,可以编写
==True=True
有效值
当前无法返回
。我想你的意思可能是
validValue(只是n)={-我可以猜到一些表达式,但你可以计算出如果n有效则为True,否则为False-}
在保护表达式中,你用一个等号指定结果,而不是双等号。这就是那个特定错误的原因,至少,ghc只是看到了比较,并想知道结果应该是什么:)我想你需要一个():(和$map$validValue$concat(x:xs))==TrueTo展开@ollanta的评论,你不需要严格地使用
==True
:and'将已经计算为
Bool
,因此,不需要使用
True
测试等式。一种解决方案是将
=
更改为
=
,但如果您想痛苦地明确说明防护,可以编写
==True=True
有效值
当前无法返回
。我想你的意思可能是
validValue(只是n)={-我可以猜到一些表达式,但如果n是有效的,你可以计算为True,否则为False-}
谢谢,完美地解决了我的问题。我喜欢你把我的故障线路放在你的上面,这样我的问题就清楚了。:-)这里也不需要
(x:xs)
的模式,您可以使用
checkEveryElement(数独难题)=所有有效值$concat难题
谢谢,完美地解决了我的问题。我喜欢你把我的故障线路放在你的上面,这样我的问题就清楚了。:-)这里也不需要
(x:xs)
的模式,您可以只使用
checkEveryElement(数独游戏)=all validValue$concat puzzle