Я пытаюсь научиться Haskell, написав простую консольную шахматную игру. Он отображает шахматную доску и получает шаги со стандартного ввода в SAN notation. Вот что у меня до сих пор:Как обрабатывать ошибки времени выполнения в Haskell?
import System.IO
import Chess
import Chess.FEN
main = do
putStrLn "Welcome to Console Chess!"
putStrLn $ show defaultBoard
gameLoop defaultBoard
gameLoop board = do
putStr "Your move: "
hFlush stdout
move <- getLine
let newBoard = moveSAN move board
case newBoard of
Left _ -> do
putStrLn "Invalid move, try again..."
gameLoop board
Right b -> do
putStrLn $ show b
gameLoop b
Проблема заключается в том, что вызов функции moveSAN
иногда происходит сбой программы, теряя весь прогресс, достигнутый в игре. Например, при нажатии Enter в "Ваш ход:" подсказка производит:
Your move:
cchess: Prelude.head: empty list
В противном случае, введя двузначное число производит:
Your move: 11
cchess: Error in array index
Ввод двух периодов дает:
Your move: ..
cchess: Char.digitToInt: not a digit '.'
Я хотел бы поймать эти ошибки и сообщить пользователю, что перемещение, которое они ввели, не соответствует действительной ноте SAN. Как я могу это сделать?
Ваш код верен. Это ошибка в библиотеке chesshs, которую вы используете. При неправильном вводе он должен возвращать 'Left NoParse', но вместо этого он падает из-за использования частичных функций, таких как' head' и 'digitToInt' :( –
Согласен, решение является полной функцией, которая может быть только сама из суммы функции. Вам нужно будет обернуть вызовы библиотеки в выписке, чтобы сделать общие функции ... –
«Вам нужно будет обернуть вызовы библиотеки в выписке» Как это сделать? – hedgie