Вы можете создать свой собственный декодер с помощью succeed
и fail
от Json.Decode
. Я изменил приведенный ниже порядок аргументов, чтобы сделать его связным.
Редактировать: Разделяемый декодер касается проблем.
import Json.Decode as Json
import Result
-- // This is a Result helper function that could be used elsewhere.
-- // Currently, there is no Result.either in Elm core.
eitherR : (x -> b) -> (a -> b) -> Result x a -> b
eitherR fErr fOk result =
case result of
Err x ->
fErr x
Ok a ->
fOk a
customDecoder : (a -> Result String b) -> Json.Decoder a -> Json.Decoder b
customDecoder fResult decoder =
decoder |> Json.andThen (fResult >> eitherR Json.fail Json.succeed)
Подключив это на связанный вопрос ...
let number =
Json.oneOf [ Json.int, Json.string |> customDecoder String.toInt ]
Вот другой пример использования. Это версия onChange
, которая преобразует значение в целое число. В основном полезно для select
, когда вы знаете, что значение параметра - Int.
import Html
import Html.Attributes exposing (..)
import Html.Events exposing (..)
import String
onChangeInt : (Int -> msg) -> Attribute msg
onChangeInt fMsg =
on "change" (targetValue |> customDecoder String.toInt |> Json.map fMsg)
Обратите внимание, что targetValue
определяется в модуле Html.Events:
targetValue : Decoder String
Спасибо, но я не хочу, по умолчанию, я хочу, чтобы потерпеть неудачу, если это не получится! – vitiral
@vitiral Перейдите в свою собственную функцию обработки результатов там. –