2012-01-18 16 views
6

Pracuję nad poniższym kodem i chciałem znaleźć indeks numeru w ciągu znaków. Więc użyłem findIndex, ale zwraca wartość Może Int, podczas gdy ja chcę tylko wartość Int.Konwertuj Może Int do Int w Haskell

Jak mogę przekonwertować wartość Int może Int do Int lub czy istnieje sposób, w jaki mogę wyodrębnić Int od Maybe Int. Kod powinien wydrukować komunikat o błędzie, jeśli Może Int ma nic

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 

Odpowiedz

16

można łatwo zrobić za pomocą dopasowywania wzorców w swoim oświadczeniu do:

case findposition number box of 
    Just n -> -- do whatever with n 
    Nothing -> putStrLn "Invalid number!" -- you can handle the error however you want. 

Dobrym rozwiązaniem byłoby stworzenie osobnego działania IO Aby uzyskać numer:

getNumber = do putStrLn "Enter the number:" 
       number <- readLn 
       case findposition number box of 
       Just n -> -- Do whatever 
       Nothing -> putStrLn "Please try again." >> getNumber 

W ten sposób, jeśli użytkownik wprowadzi nieprawidłowy numer, po prostu pyta ponownie.

Również, jak napisano teraz, twój kod nie będzie działać. Powinieneś mieć inny sposób przechowywania liczb w box jako rzeczywiste liczby; teraz są w Strings.

+0

Właściwie zamierzano znaleźć numer wprowadzony przez użytkownika i zastąpić go później dowolną inną postacią, powiedzmy "x" –

+0

Ah. W takim przypadku, ponieważ przeglądasz String, będziesz chciał przeczytać w 'Char' zamiast' Int'. W rzeczywistości powinieneś być w stanie całkowicie pominąć bit ':: IO Int'. –

+0

Okay dzięki .. Spróbuję tego i na pewno wrócę do ciebie ... –

10

Oczywiście nie jest to możliwe w ogóle: gdy wyszukiwanie nie powiedzie się, nie ma kanonicznej liczby całkowitej zwracanej wartości, więc otrzymasz wtedy Nothing bez żadnej takiej wartości.

Jeśli nie troszczą się o sprawy Nothing (np ponieważ będzie zawsze upewnij się, że jest jeden taki element) można użyć funkcji fromJust z Data.Maybe, które można szybko wdrożyć się również:

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

Jednak nie jest to naprawdę godne polecenia, ponieważ trzeba będzie trzeba się upewnić, że to nie pęknie, a robienie tego jest znacznie łatwiejsze poprzez odpowiednie dopasowanie wzorców.

+0

Wspomniał, że chciał "zwrócić komunikat o błędzie" na "Nic". Chociaż jest to trochę niejednoznaczne, założyłem, że będzie zadowolony, po prostu wypisując błąd, a nie po awarii programu. –

+4

Jeśli * jest * "całkowitą liczbą kanoniczną" dla kontekstu, w którym pracujesz, możesz użyć 'fromMaybe canonicalInt maybeVal', gdzie' canonicalInt :: Int' i 'maybeVal :: Maybe Int'. Zobacz dokumentację [Data.Maybe docs] (http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Maybe.html#v:fromMaybe) –