Есть несколько проблем с самим вопросом. Во-первых, вы не публикуете полученную ошибку. Я получаю следующую ошибку:
The 2nd argument to `field` is not what I expect:
25| Decode.field "data" Decode.list
^^^^^^^^^^^
This `list` value is a:
Decode.Decoder a -> Decode.Decoder (List a)
But `field` needs the 2nd argument to be:
Decode.Decoder a
Во-вторых, JSON, который вы опубликовали, недопустим, data
должен быть заключен в кавычки, а свойства и значения должны быть разделены :
, а не =
.
В-третьих, тип priceDecoder
кажется неправильным, поскольку JSON не содержит данных String
, или вы не указываете, что также хотите преобразовать Float
в String
. Я предполагаю, что тип просто неправильный.
Итак, ошибка, которую вы (или, по крайней мере, я) получаете, говорит о том, что list
является функцией Decoder a -> Decoder (List a)
, в то время как она ожидает только значение Decoder a
. Это потому, что list
ожидает, что ему будет передан Decoder a
, который он будет использовать для декодирования каждого элемента в списке.
Декодер, который мы будем использовать, это Decode.field "price" Decode.float
, который будет декодировать поле "цена" объекта как Float
.
Я также изменю тип priceDecoder
с Decoder String
на Decoder (List Float)
, поскольку цена составляет Float
, и мы декодируем их List
, а не просто получаем первый или последний значение или что-то подобное. Я полагаю, это то, что вы хотите, так как вы говорите «по крайней мере, вернуть каждую цену».
priceDecoder
, которое мы получаем тогда:
priceDecoder : Decode.Decoder (List Float)
priceDecoder =
Decode.field "data" (Decode.list (Decode.field "price" Decode.float))