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