List 初级警卫失误哈斯克尔
我刚刚开始做我的第三份学校作业,我又遇到了一个我自己似乎无法解决的noob错误 我们将编写一个数独解算器,我目前正在编写一个函数,它将确定我的数独中的元素是否属于正确的类型。它们的类型可能是Int(只有Int或什么都没有) 以下是代码的相关部分: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
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