2015-12-18 9 views
18

Próbuję przekonwertować ciąg na liczbę całkowitą za pomocą String.toInt. Jednak, gdy chcę powiązać wynik do zmiennej, a następnie wykonaj kilka prostych matematyki z nim otrzymuję ten błąd:Konwersja ciągu na int za pomocą funkcji ToInt

Function add is expecting the 2nd argument to be:

Int 

But it is:

Result String Int 

Jak mogę tylko wyodrębnić część całkowitą wyniku?

Odpowiedz

21

ToInt może zawieść w analizie. Trzeba sprawdzić go przy użyciu instrukcji case:

case toInt str of 
    Err msg -> ... -- do something with the error message 
    Ok val -> ... -- val is an Int which you can add 

More about Result here

25

Oto jak dostarczyć konwersji o wartości domyślnej w przypadku analizowania zawiedzie.

String.toInt "5" |> Result.toMaybe |> Maybe.withDefault 0 
8

Liczba całkowita może być wyciągnięta z użyciem

Result.withDefault 0 (String.toInt "2") 

Możesz przeczytać więcej na ten temat here

1

Według Elm String reference documentation, jeśli wydobywania numer z jakiegoś surowego wprowadzanych przez użytkownika, będziesz zwykle używać Result.withDefault do obsługi złych danych w przypadku niepowodzenia przetwarzania. Można łańcuch tę operację przy użyciu rur dla czystszego kodzie:

String.toInt "5" |> Result.withDefault 0 
0

Wykorzystanie mapy:

answer = Result.map2 (+) (String.toInt "1") (String.toInt "2") 

map2:

Apply a function to two results, if both results are Ok. If not, the first argument which is an Err will propagate through.

mieć wynik add jako ciąg

resultAsString r = 
    case r of 
     Err msg -> msg 
     Ok value -> toString value 

resultAsString answer 

, aby ułatwić można utworzyć addStrings funkcję:

addStrings : String -> String -> Result String Int 
addStrings a b = 
    Result.map2 (+) (String.toInt a) (String.toInt b) 

Można nawet uciec z typem Result sumie:

addStrings : String -> String -> String 
addStrings a b = 
    let 
     r = 
      Result.map2 (+) (String.toInt a) (String.toInt b) 
    in 
    case r of 
     Err msg -> 
      msg 

     Ok value -> 
      toString value 

Testing

import Html exposing (Html, text) 

main : Html msg 
main = 
    text (addStrings "1" "2") 


output 3 
0

W withDefault metoda zmusza aby zdefiniować wartość, która może być użyta do obliczeń, ale nie zawsze możliwe jest ustalenie wartości istotnej dla błędów. Najczęściej potrzebujesz wszystkich możliwych wartości, a domyślnie nie pasuje. Tu pełnić funkcję wyboru typ wyniku można użyć, aby zdecydować, czy używać czy nie wartość po przeliczeniu:

isErrorResult r = 
    case r of 
     Err msg -> 
      True 

     Ok value -> 
      False 

można go używać tak:

r = String.toInt "20b" 

if isErrorResult r then 
    -- not a valid Interger, abort or whatever 
else 
    -- a good integer, extract it 
    a = Result.withDefault 0 r 
    -- and make good use of it 

wartość default (0 w tym case) przekazana do withDefault jest bez znaczenia, ponieważ upewniliśmy się, że r nie jest Err.