Elm - Получить данные списка JSON

Я пытаюсь получить список данных JSON с этого URL: https://raw.githubusercontent.com/raywenderlich/recipes/master/Recipes.json

Я не мог понять, что делать в этой ситуации

...
main =
  App.program
  { init = init
  , view = view
  , update = update
  , subscriptions = \_ -> Sub.none
  }

-- MODEL

type alias Model =
  { name : String
  , imageURL: String
  }

init =
  (Model "" "", Cmd.none)

-- UPDATE

type Msg
  = Recipes
  | FetchSucceed (List Model)
  | FetchFail Http.Error

update msg model =
  case msg of
    Recipes ->
      (model, fetchRecipes)

    FetchSucceed recipe ->
      (recipe, Cmd.none)

    FetchFail _ ->
      (model, Cmd.none)


-- VIEW

view model =
  div []
    [ ul [] (List.map getItem model)
  ]


getItem item =
  li [] [ text item.name ]

-- HTTP

fetchRecipes =
  let
    url =
      "https://raw.githubusercontent.com/raywenderlich/recipes/master/Recipes.json"
  in
    Task.perform FetchFail FetchSucceed (Http.get decodeListRecipes url)


decodeRecipes =
  Json.object2 Model
    ("name" := Json.string)
    ("imageURL" := Json.string)

decodeListRecipes =
  Json.list decodeRecipes

Но я продолжаю получать эту ошибку:

Function `program` is expecting the argument to be:
    { ...,
      update :
        Msg
          -> { imageURL : String, name : String }
          -> ( { imageURL : String, name : String }, Cmd Msg ) ,
        view : { imageURL : String, name : String } -> Html Msg
    }

But it is: 
   { ...
   , update : Msg -> List Model -> ( List Model, Cmd Msg )
   , view : List { a | name : String } -> Html b
   }

1 ответ

Решение

Ваш FetchSucceed тег определяется как наличие списка моделей (FetchSucceed (List Model)), но в вашем update функция, которую вы рассматриваете, как если бы это была одна модель, а не список. Если я изменю значение на множественное число, оно должно подчеркнуть проблемную область:

FetchSucceed recipes ->
    (recipes, Cmd.none)

Не зная точно, что вы пытаетесь достичь, я могу лишь дать подсказку о потенциальном решении, например, если вы просто хотели взять первый элемент списка и вернуться к текущей модели, если не было возвращено никаких рецептов, вы может сделать что-то вроде этого:

FetchSucceed recipes ->
    let recipe =
        case List.head recipes of
            Just r -> r
            Nothing -> model
    in
        (recipe, Cmd.none)
Другие вопросы по тегам