module QueenAttack let allowed pos = pos > -1 && pos < 8 let create (position: int * int) = match position with | (r, c) when allowed r && allowed c -> true | _ -> false let difference a b = abs (a - b) let diagonallyAttacked (a: int * int) (b: int * int) = let cmpARow = a |> fst |> difference let cmpACol = a |> snd |> difference (b |> fst |> cmpARow) = (b |> snd |> cmpACol) let canAttack (queen1: int * int) (queen2: int * int) = (=) (queen1 |> fst) (queen2 |> fst) || (=) (queen1 |> snd) (queen2 |> snd) || diagonallyAttacked queen1 queen2