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

How can I apply the Result.withDefault function to a function that produces a Result

我有这个函数可以解码 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

如何用 Result.withDefault 包装 decodeItem 的输出,以便它生成有效的项目或 returns 一个空的 Item。空 Item 将是 Result.withDefault.

的第一个参数

假设您有一个 returns 空 Item 的函数,例如 emptyItem,您只需执行您描述的步骤:

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

结果:

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

emptyItem可以是returnsItem记录默认值的函数,例如:

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

或者一些对您有意义的合理默认值