String.toIntを使用して文字列を整数に変換しようとしています。ただし、結果を変数にバインドし、それを使用して簡単な計算を行うと、次のエラーが発生します。
関数
add
は、2番目の引数が次のようになることを期待しています:Int
しかしそれは:
Result String Int
結果の整数部分を抽出するにはどうすればよいですか?
toIntは解析に失敗する可能性があります。あなたはcase文を使ってそれをチェックする必要があります:
case toInt str of
Err msg -> ... -- do something with the error message
Ok val -> ... -- val is an Int which you can add
解析が失敗した場合に、変換にデフォルト値を提供する方法は次のとおりです。
String.toInt "5" |> Result.toMaybe |> Maybe.withDefault 0
Elm String reference documentation によると、生のユーザー入力から数値を抽出する場合、通常、Result.withDefault
を使用して、解析が失敗した場合に不良データを処理する必要があります。よりクリーンなコードのためにパイプを使用してこの操作を連鎖させることができます:
String.toInt "5" |> Result.withDefault 0
withDefault
メソッドを使用すると、計算に使用できる値を定義する必要がありますが、エラーにとって重要な値を常に設定できるとは限りません。ほとんどの場合、すべての可能な値が必要であり、デフォルトは適合しません。ここでは、変換された値を使用するかどうかを決定するために使用できる結果タイプチェック関数を提供します。
isErrorResult r =
case r of
Err msg ->
True
Ok value ->
False
次のように使用できます。
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
default
がwithDefault
ではないことを確認したため、r
に渡されたErr
値(この場合は0)は意味がありません。
たぶんタイプを変更したようです。
isErrorResult : String -> Bool
isErrorResult r =
case String.toInt r of
Nothing -> True
Just value -> False
マップを使用:
answer = Result.map2 (+) (String.toInt "1") (String.toInt "2")
map2 :
2つの結果がOKの場合、2つの結果に関数を適用します。そうでない場合は、Errである最初の引数が伝搬されます。
add
結果を文字列として取得するには
resultAsString r =
case r of
Err msg -> msg
Ok value -> toString value
resultAsString answer
物事を簡単にするために、addStrings
関数を作成できます。
addStrings : String -> String -> Result String Int
addStrings a b =
Result.map2 (+) (String.toInt a) (String.toInt b)
Result
タイプを完全に回避することもできます。
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
テスト中
import Html exposing (Html, text)
main : Html msg
main =
text (addStrings "1" "2")
output 3
以下のようにしてこれを行うことができます。
---- Elm 0.19.0 ----------------------------------------------------------------
Read <https://Elm-lang.org/0.19.0/repl> to learn more: exit, help, imports, etc.
--------------------------------------------------------------------------------
> parseInt string = String.toInt string
<function> : String -> Maybe Int
> resultParseInt string = \
| Result.fromMaybe ("error parsing string: " ++ string) (parseInt string)
<function> : String -> Result String Int
> resultParseInt "12"
Ok 12 : Result String Int
> resultParseInt "12ll"
Err ("error parsing string: 12ll") : Result String Int
>
Maybe.withDefault 0 (String.toInt "42")