2012-01-18 8 views
6

Я работаю над следующим кодом и хотел бы найти индекс номера в строке строки. Поэтому я использовал findIndex, но он возвращает значение Maybe Int, тогда как я хочу только значение Int.Convert Maybe Int to Int в Haskell

Как я могу преобразовать значение Int Int Int или есть способ, в котором я могу извлечь Int из Maybe Int. Код должен напечатать сообщение об ошибке, если Maybe 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 

ответ

16

Вы можете легко сделать это с помощью сопоставления с образцом в вашем 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 в качестве действительных чисел; прямо сейчас, они в Строках.

+0

На самом деле, было намерено найти номер, введенный пользователем, и заменить его позже любым другим символом: «x» –

+0

Ah. В этом случае, поскольку вы просматриваете строку, вам нужно прочитать «Char», а не «Int». Фактически, вы должны полностью исключить бит ':: IO Int'. –

+0

Хорошо спасибо .. Я попробую это и обязательно вернусь к вам ... –

10

Очевидно, что это невозможно вообще: когда поиск не увенчался успехом, нет никакого канонического целочисленного значения, поэтому вы получите Nothing без какого-либо такого значения.

Если вы не очень заботятся о Nothing случае (например, потому что вы всегда убедитесь, что один из таких элементов), вы можете использовать функцию fromJust из Data.Maybe, которые вы можете быстро реализовать себя:

findposition number = (\(Just i)->i) . findIndex (==number) 

Однако это не рекомендуется, потому что вы : необходимо убедиться, что это не сломается, и сделать это намного проще с помощью соответствующего соответствия шаблону.

+0

Он упомянул, что хотел «вернуть сообщение об ошибке» в «Ничего». Хотя это немного неоднозначно, я предположил, что он был бы счастлив просто распечатать ошибку, вместо того, чтобы сбой программы. –

+4

Если есть * «каноническое целое» для контекста, в котором вы работаете, вы можете использовать 'fromMaybe canonicalInt maybeVal', где' canonicalInt :: Int' и 'maybeVal :: Maybe Int'. См. [Data.Maybe docs] (http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Maybe.html#v:fromMaybe) –