我正在寻找提示或解释,以了解为什么这段代码在该块中的第一个else if语句上始终出现解析错误。它说可能是缩进或括号有问题,但我似乎找不到它们。因此,我正在寻找另一组经验丰富的眼睛来使我走上正确的道路。我觉得我忽略了一些很小的东西,但是似乎找不到。这是针对数独求解器的(我承认整个数独求解器是一个类的作业。这是我第一次发布,因此我不是100%确定这是否是一个可以接受的问题,如果不是,请告诉我)。
此功能是获取数独游戏板(基本上是列表的列表)和两个整数,它们是您正在查看的棋盘的3x3部分的坐标,然后从该3x3部分返回数字序列董事会。
我知道这不是解决该问题的哈斯克尔式方法(我最终还是蛮横地强迫了它),我真的只是在学习Haskell了几周,但我想弄清楚为什么其他情况会不断出现作为错误。
getBox :: Board -> Int -> Int -> Sequence
getBox b x y = do
let i = x
let j = y
let x0 = b!!0
let x1 = b!!1
let x2 = b!!2
let x3 = b!!3
let x4 = b!!4
let x5 = b!!5
let x6 = b!!6
let x7 = b!!7
let x8 = b!!8
if (i==0 && j==0)
then let z = [x0!!0, x0!1, x0!!2, x1!!0 x1!!1, x1!!2, x2!!0, x2!!1, x2!!2]
else if (i==0 && j==1)
then let z = [x0!!3, x0!4, x0!!5, x1!!3 x1!!4, x1!!5, x2!!3, x2!!4, x2!!5]
else if (i==0 && j==2)
then let z = [x0!!6, x0!7, x0!!8, x1!!6 x1!!7, x1!!8, x2!!6, x2!!7, x2!!8]
else if (i==1 && j==0)
then let z = [x3!!0, x3!!1, x3!!2, x4!!0, x4!!1, x4!!2, x5!!0, x5!!1, x5!!2]
else if (i==1 && j==1)
then let z = [x3!!3, x3!!4, x3!!5, x4!!3, x4!!4, x4!!5, x5!!3, x5!!4, x5!!5]
else if (i==1 && j==2)
then let z = [x3!!6, x3!!7, x3!!8, x4!!6, x4!!7, x4!!8, x5!!6, x5!!7, x5!!8]
else if (i==2 && j==0)
then let z = [x6!!0, x6!!1, x6!!2, x7!!0, x7!!1, x7!!2, x8!!0, x8!!1, x8!!2]
else if (i==2 && j==1)
then let z = [x6!!3, x6!!4, x6!!5, x7!!3, x7!!4, x7!!5, x8!!3, x8!!4, x8!!5]
else let z = [x6!!6, x6!!7, x6!!8, x7!!6, x7!!7, x7!!8, x8!!6, x8!!7, x8!!8]
答案 0 :(得分:4)
只需删除let z =
出现的所有位置,即可继续下一个错误。
答案 1 :(得分:0)
let
表达式具有绑定和主体。典型的let
表达式是:
let x = 2 in x + x
^^^^^ ^^^^^
binding body
这仅表示将2
替换为x
在体内。这就是let
的全部含义(也就是说,您始终可以通过替换来手动摆脱let
)。 let
块中do
的允许语法对此有点模糊,可能会给人一种印象,即它就像命令式语言中的可变变量,但不是。
do
let i = x
let j = y
pure (i + j)
手段
let i = x in
let j = y in
pure (i + j)
也就是说,let的主体是do
块的其余部分。
任何变量都可以追溯到单个唯一定义或函数参数。正如您尝试做的那样,不能由多个不同的let
语句动态地定义一个变量。您只需定义一次z
。在您的情况下,可以使用 guards 完成,这是一种进行条件定义的方式。
let z
| i == 0 && j == 0 = [x0!!0, x0!!1, -- oh my god I am not typing this
| i == 0 && j == 1 = [x0!!3, x0!!4, -- more?
| ...
您也可以在没有警卫的情况下完成此操作,只需将if
链移动到let
内:
let z = if i == 0 && j == 0 then [...]
else if i == 0 && j == 1 then [...]
...
我希望这会有所帮助。也许您的强力解决方案所带来的痛苦会被摊销。