Преобразовать, возможно, Int в Int в Haskell
Я работаю над следующим кодом и хотел бы найти индекс числа в строке окна. Поэтому я использовал findIndex, но он возвращает значение Maybe Int, тогда как я хочу только значение Int.
Как я могу преобразовать, возможно, Int в значение Int или есть ли способ, которым я могу извлечь Int из Возможно Int. Код должен напечатать сообщение об ошибке, если, возможно, Int ничего
box:: String
box = unlines $ ["0 | 1 | 2",
"---------",
"3 | 4 | 5",
"---------",
"6 | 7 | 8"]
moves = do
putStrLn " Enter the number"
number <- readLn :: IO Int
print number
findpostion number box
findposition number box = findIndex (==number) box
2 ответов
вы можете легко сделать это с помощью сопоставления шаблонов в вашем do
о себе:
case findposition number box of
Just n -> -- do whatever with n
Nothing -> putStrLn "Invalid number!" -- you can handle the error however you want.
хорошим вариантом было бы создать отдельное действие ввода-вывода, чтобы получить номер:
getNumber = do putStrLn "Enter the number:"
number <- readLn
case findposition number box of
Just n -> -- Do whatever
Nothing -> putStrLn "Please try again." >> getNumber
таким образом, если пользователь вводит недопустимый номер, он просто спрашивает снова.
также, как написано сейчас, ваш код не будет работать. У вас должен быть какой-то другой способ хранения чисел в box
как фактические числа; прямо сейчас, они в строках.
очевидно, что это вообще невозможно: когда поиск не удается, нет канонического целочисленного возвращаемого значения, поэтому вы получаете Nothing
без такого значения.
если вы действительно не заботитесь о Nothing
case (например, потому что вы всегда будете уверены, что есть один такой элемент) вы можете использовать