以递归方式解码嵌套列表(具有任意深度的列表列表)

Decoding a nested list (list of lists with arbitrary depth) recursively

提问人:Robert Lisaru 提问时间:9/24/2023 最后编辑:Robert Lisaru 更新时间:9/24/2023 访问量:54

问:

请考虑以下递归类型定义:

type NestedList a
    = Elem a
    | SubList (List (NestedList a))

如何编写解码器以将 JSON 列表(例如)解码为以下类型:[1, [[2, [3, 4]], 5], 6, [7, 8, 9]]NestedList

SubList
    [ Elem 1
    , SubList [ SubList [ Elem 2, SubList [ Elem 3, Elem 4 ] ], Elem 5 ]
    , Elem 6
    , SubList [ Elem 7, Elem 8, Elem 9 ]
    ]
JSON 嵌套列表 ELM

评论

0赞 glennsl 9/24/2023
您发布的代码不会产生该错误。它确实在类型定义上产生了不同的错误,但修复它后,没有其他编译器错误。请确保包含一个最小的可重复示例
0赞 Robert Lisaru 9/24/2023
谢谢你@glennsl,确实编译最终成功了,我不得不重新启动笔记本电脑。我的编译器有一个临时错误,也许它在构建之间内部缓存了一些东西。我现在将编辑这个问题,因为它没有意义。
0赞 glennsl 9/25/2023
那么现在它本质上是 stackoverflow.com/questions/46230690/ 的副本......

答:

2赞 Robert Lisaru 9/24/2023 #1

它可以递归地完成,使用 和 . 整数嵌套列表的解码器如下所示:Json.Decode.oneOfJson.Decode.lazy

import Json.Decode as Decode exposing (Decoder)

nestedListDecoder : Decoder (NestedList Int)
nestedListDecoder =
    Decode.oneOf
        [ Decode.int |> Decode.map Elem
        , Decode.list (Decode.lazy (\_ -> nestedListDecoder)) |> Decode.map SubList
        ]