如何将Result.withDefault函数应用于产生结果的函数

时间:2018-10-30 07:48:43

标签: json functional-programming decode elm

我有此函数可解码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 :(得分:4)

鉴于您有一个返回空Item的函数,例如emptyItem,则只需要执行已描述的步骤即可:

  • 使用Result.withDefault
  • 来包装decodeItem的输出
  • 空的Item将是Result.withDefault的第一个参数

结果:

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

emptyItem可以是返回具有默认值的Item记录的函数,例如:

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

或者一些合理的默认设置,对您来说很有意义