Haskell中的简单chess函数
我的作业是写与国际象棋有关的简单函数。Haskell中的简单chess函数,haskell,filter,Haskell,Filter,我的作业是写与国际象棋有关的简单函数。rook功能运行良好,我想它显示了从给定的起始坐标开始,您可以从何处开始。现在我一直在使用knight函数。我的想法是按以下条件过滤坐标列表:如果坐标差的abs值为3,且行不同,则这是一个有效步骤。但我真的不知道该如何在Haskell中实现这一点。你知道我该怎么做吗 我的代码: import Data.List possibleMoves = [ (x, y) | x <- [0..7], y <- [7,6..0]] rook :: (In
rook
功能运行良好,我想它显示了从给定的起始坐标开始,您可以从何处开始。现在我一直在使用knight
函数。我的想法是按以下条件过滤坐标列表:如果坐标差的abs值为3,且行不同,则这是一个有效步骤。但我真的不知道该如何在Haskell中实现这一点。你知道我该怎么做吗
我的代码:
import Data.List
possibleMoves = [ (x, y) | x <- [0..7], y <- [7,6..0]]
rook :: (Int, Int) -> [(Int, Int)]
rook (x,y) = filter (/=(x,y)) (filter ((==y).snd) possibleMoves ++ filter ((==x).fst ) possibleMoves)
knight :: (Int, Int) -> [(Int, Int)]
knight (x,y) = filter ((==3)((abs(y - head(map snd(possibleMoves))))).snd) possibleMoves
看起来你让事情变得更难了 给定以下位置
K
,您可以简单地列出每个骑士招式:
1 2 3 4 5
+---+---+---+---+---+
1 | | H | | A | |
+---+---+---+---+---+
2 | G | | | | B |
+---+---+---+---+---+
3 | | | K | | |
+---+---+---+---+---+
4 | F | | | | C |
+---+---+---+---+---+
5 | | E | | D | |
+---+---+---+---+---+
并移除棋盘外的棋子
骑士::(Int,Int)->[(Int,Int)]
奈特(x,y)=过滤器有效位置
[(x+1,y+2)
,(x+2,y+1)
,(x+2,y-1)
,(x+1,y-2)
,(x-1,y-2)
,(x-2,y-1)
,(x-2,y+1)
,(x-1,y+2)
]
然后,如果你觉得自己重复太多了:
knight' :: (Int, Int) -> [(Int, Int)]
knight' (x, y) = filter validPosition
[ (x + dx, y + dy) | dx <- [-2,-1,1,2]
, dy <- [-2,-1,1,2]
, ... something about dx, dy and 3 ...
]
knight':(Int,Int)->[(Int,Int)]
knight'(x,y)=过滤器有效位置
[(x+dx,y+dy)| dx你过滤骑士位置的想法实际上非常简洁,而且使用列表理解很容易实现
knight (x, y) = [(x', y') | x'<-[x-2..x+2], y'<-[y-2..y+2], abs (x' - x) + abs (y' - y) == 3 ]
你试过什么?你写下了数学方程了吗?问题在哪里?在哈斯凯尔,绝对值函数是abs
,差分函数是(-)
,你可以通过(+)
累积行和列的差分。最后,你可以通过(/=)确定两行是否不同
。你能把它们粘在一起吗?@ThomasM.DuBuisson我的问题是我不知道如何使用abs值计算函数进行过滤。我的函数现在看起来是这样的:knight(x,y)=filter(/=(x,y))(filter(=3)(abs(x-fst(possibleMoves)))possibleMoves)
我收到很多类型错误。请不要在注释中添加代码。说“我收到很多类型错误”没有帮助。这些错误是什么。请将它们包含在上面,而不要包含在注释部分。您可以通过检查片段的类型来发现问题。将代码分成片段编写,检查类型,并查看您的类型是否符合编译器的要求。
knight (x, y) = [(x', y') | x'<-[x-2..x+2], y'<-[y-2..y+2], abs (x' - x) + abs (y' - y) == 3 ]
import Data.List (intersect)
safeKnight = intersect possibleMoves . knight