我正在尝试编写一个4x5板的棋盘游戏功能,我想做一个简单的真假Bool函数,说明基于x,y坐标的运动是否是对角线。我想放4个坐标2 x和2 y。我应该使用&&函数,例如我想把(1,1)和(2,2)?
isDiagonal x
if x == 1 && y == 1 then True
else False
isDiagonal x
if x == 2 && y == 2 then True
else False
答案 0 :(得分:1)
如果你想检查点(x,y)
是否与Haskell中的点(x',y')
在同一对角线上,一个好的起点就是一个类型。
isDiagonal :: (Int, Int) -> (Int, Int) -> Bool
虽然技术上是可选的,但为每个顶级功能提供一个明确的类型是一种很好的做法。
现在,我们需要一个这个功能的主体。
isDiagonal (x, y) (x', y') = ...
如果他们位于相同的对角线上,则x
和x'
必须与y
和y'
相距甚远。所以我们可以检查差异是否相等。即
abs (x - x') == abs (y - y')
总而言之,我们(希望)达到了预期的功能
isDiagonal :: (Int, Int) -> (Int, Int) -> Bool
isDiagonal (x, y) (x', y') = abs (x - x') == abs (y - y')
根本不需要&&
。但是我们可以使用它,例如我们想要施加一个额外的条件,就像新的点必须在4x5板上(假设1索引)
isDiagonal :: (Int, Int) -> (Int, Int) -> Bool
isDiagonal (x, y) (x', y') = x' >= 1 && x' <= 4 &&
y' >= 1 && y' <= 5 &&
abs (x - x') == abs (y - y')