Преобразовать, возможно, 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 (например, потому что вы всегда будете уверены, что есть один такой элемент) вы можете использовать