我如何实现一个解码器,由于其字段之一具有相同类型而调用自身?
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/