Как я могу применить функцию Result.withDefault к функции, которая создает результат - PullRequest
0 голосов
/ 30 октября 2018

У меня есть эта функция, которая декодирует JSON

type alias Item =
    { title : String
    , description : String
    , price : Float
    , imageUrl : String
    }

itemDecoder : Json.Decode.Decoder Item
itemDecoder =    
    D.map4 ItemData
        (D.field "title" D.string)
        (D.field "description" D.string)
        (D.field "price" D.float)
        (D.field "imageUrl" D.string)

decodeItem : Json.Decode.Value -> Item
decodeItem =
    Json.Decode.decodeValue itemDecoder

Ошибка, которую я получаю от компилятора, заключается в том, что decodeItem выдает

Json.Decode.Value -> Result Json.Decode.Error Item

вместо

Json.Decode.Value -> Item

Как можно обернуть вывод decodeItem в Result.withDefault, чтобы он генерировал действительный элемент или возвращал пустой Item. Пустой Item будет первым аргументом Result.withDefault.

1 Ответ

0 голосов
/ 30 октября 2018

Учитывая, что у вас есть функция, которая возвращает пустой Item, например emptyItem, вам просто нужно выполнить шаги, которые вы описали:

  • Обернуть вывод decodeItem с Result.withDefault
  • Пустой Item будет первым аргументом Result.withDefault

В результате:

decodeItem : D.Value -> Item
decodeItem value =
    Result.withDefault emptyItem (D.decodeValue itemDecoder value)

emptyItem может быть функцией, которая возвращает Item запись со значениями по умолчанию, например:

emptyItem : Item
emptyItem = Item "" "" 0 ""

Или некоторые разумные значения по умолчанию, которые имеют смысл для вас

...