elm - 由于其中一个字段具有相同类型,我如何实现一个调用自身的解码器?

标签 elm

我如何实现一个解码器,由于其字段之一具有相同类型而调用自身?

providerDecoder : Decoder JsonProvider
providerDecoder =
    Decode.map6 JsonProvider
        (field "Profile" profileDecoder)
        (field "Topics" <| Decode.list topicDecoder)
        (field "Links" <| linksDecoder)
        (field "RecentLinks" <| Decode.list linkDecoder)
        (field "Subscriptions" <| Decode.list providerDecoder)
        (field "Followers" <| Decode.list providerDecoder)

以下几行导致了问题:

(field "Subscriptions" <| Decode.list providerDecoder)
(field "Followers" <| Decode.list providerDecoder)

providerDecoder is defined directly in terms of itself, causing an infinite

总之,我不确定如何在保留 JsonProvider 类型的同时解决此错误。

附录:

type JsonProvider
    = JsonProvider
        { profile : JsonProfile
        , topics : List JsonTopic
        , links : JsonLinks
        , recentLinks : List JsonLink
        , subscriptions : List JsonProvider
        , followers : List JsonProvider
        }

最佳答案

编写递归 JSON 解码器时,通常必须依赖 Json.Decode.lazy .你可以这样写这两行:

(field "Subscriptions" <| Decode.list (Decode.lazy (\_ -> providerDecoder)))
(field "Followers" <| Decode.list (Decode.lazy (\_ -> providerDecoder)))

一旦你改变了,你会看到另一条关于类型不匹配的错误消息弹出,那是因为你使用的是一个构造函数联合类型,它有一个记录作为参数(这在编写递归记录时是必需的类型)。在这种情况下,我通常会像这样分离构造函数和记录类型:

type JsonProvider
    = JsonProvider JsonProviderFields

type alias JsonProviderFields =
    { profile : JsonProfile
    , topics : List JsonTopic
    , links : JsonLinks
    , recentLinks : List JsonLink
    , subscriptions : List JsonProvider
    , followers : List JsonProvider
    }

现在您可以重写提供程序解码器以首先解码 JsonProviderFields 记录,然后将其映射到 JsonProvider:

providerDecoder : Decoder JsonProvider
providerDecoder =
    Decode.map6 JsonProviderFields
        (field "Profile" profileDecoder)
        (field "Topics" <| Decode.list topicDecoder)
        (field "Links" <| linksDecoder)
        (field "RecentLinks" <| Decode.list linkDecoder)
        (field "Subscriptions" <| Decode.list (Decode.lazy (\_ -> providerDecoder)))
        (field "Followers" <| Decode.list (Decode.lazy (\_ -> providerDecoder)))
        |> Decode.map JsonProvider

关于elm - 由于其中一个字段具有相同类型,我如何实现一个调用自身的解码器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46230690/

相关文章:

request - 在 ELM 中,GET 请求不能有正文,是吗?

elm - 为什么 Elm 架构被称为 TEA?

Elm:您将如何构建和设计您的 UI?

playframework - 从 SBT 二进制分发版中排除 Elm 源文件

elm - 您如何管理更新路径/消息构造函数的爆炸式增长?

elm - 如果我想使用 Platform.Sub.map,是否必须导入它?

json - 解码嵌套 JSON 结构

Elm - 如何使用 HTML 事件?

cookies - 如何在Elm中读取cookie?

elm - 如何更新榆树中的内部记录