Проблема в том, что test
по-прежнему является списком [(Position, Col)]
, поэтому его нельзя передать в snd
, который ожидает один кортеж (a, b)
. Если вы можете гарантировать, что в вашем массиве кусков будет совпадение, вы должны изменить свое тело на:
drawBoardCell (x, y) pieces =
let [match] = filter (\((a,b),_) -> a == x && b == y) pieces
case match of
(_, Black) -> " b "
(_, White) -> " w "
_ -> " . "
Обратите внимание на использование case
здесь вместо if
. В этом нет особой необходимости, но он более понятен при сравнении значения с несколькими вариантами для сопоставления таким образом.
Если, однако, как я подозреваю, так, у вас может быть 0 или 1 совпадение, вам нужно использовать что-то вместо этого:
drawBoardCell (x, y) pieces = do
case filter (\((a,b),_) -> a == x && b == y) pieces of
[(_, Black)] -> " b "
[(_, White)] -> " w "
_ -> " . "
Это выведет " . "
, если значение не присутствует в отфильтрованном списке, если значение присутствует несколько раз, или если Col
одного совпадения равно ни White
, ни Black
.
В комментариях указывается, что вы можете по-разному обрабатывать отсутствие совпадений и множественных совпадений. В этом случае:
drawBoardCell (x, y) pieces = do
case filter (\((a,b),_) -> a == x && b == y) pieces of
[(_, Black)] -> " b "
[(_, White)] -> " w "
[] -> " . " -- Case of no matches
_ -> error "Multiple pieces cannot occupy the same position " ++ show (x, y)
Этот пример вызовет ошибку времени выполнения, если список содержит несколько совпадений (что может быть полезно для отладки).