2017-07-22 1 views
1

Comment puis-je mettre à jour un élément dans une liste?Comment mettre à jour un élément dans une liste et maintenir son index?

J'ai essayé les éléments suivants:

setFeaturedLink links link = 
    let 
     dictionary = 
      Dict.fromList links 

     result = 
      Dict.filter (\k v -> v.title == link.title) dictionary |> Dict.toList |> List.head 

     index = 
      case result of 
       Just kv -> 
        let 
         (i, _) = 
          kv 
        in 
         i 

       Nothing -> 
        -1 
    in 
     if not <| index == -1 then 
      Dict.update index (Just { link | isFeatured = isFeatured }) dictionary |> Dict.values 
     else 
      [] 

Le 2ème paramètre de la fonction update provoque un décalage.

59 | Indice Dict.update (Just {lien | isFeatured = isFeatured}) dictionnaire ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^ fonction update attend le 2ème argument soit:

Maybe 
    { contentType : ContentType 
    , profile : Profile 
    , title : Title 
    , topics : List Topic 
    , url : Url 
    , isFeatured : Bool 
    } 
-> Maybe 
     { contentType : ContentType 
     , isFeatured : Bool 
     , profile : Profile 
     , title : Title 
     , topics : List Topic 
     , url : Url 
     } 

Mais il est:

Maybe 
    { contentType : ContentType 
    , isFeatured : Bool 
    , profile : Profile 
    , title : Title 
    , topics : List Topic 
    , url : Url 
    } 

Astuce: il ressemble à une fonction a besoin 1 argument de plus.

Existe-t-il un exemple simple de la façon dont je peux mettre à jour un élément arbitraire dans une liste?

Répondre

2

Oui, vous pouvez seulement map les liens vers des liens avec valeur mise à jour:

let 
    updateLink l = 
    if l.title == link.title then 
     { l | isFeatured = True } 
    else 
     l 
in 
    List.map updateLink links 

Pour être honnête, je ne comprends pas ce que isFeatured est dans votre code, mais je suppose que vous voulez le mettre à jour Vrai si link.title correspond.

+0

Je suis tellement embarrassée ... –

+0

C'est très bien :) –

1

Existe-t-il un exemple simple de la façon dont je peux mettre à jour un élément arbitraire dans une liste?

Que diriez-vous quelque chose comme this, qui est vaguement basé sur le code que vous avez fourni:

import Html exposing (text) 
import List 

type alias Thing = { title: String, isFeatured: Bool } 

bar = (Thing "Bar" False) 

things = [(Thing "Foo" False), 
     bar] 

featureThing things thing = 
    List.map (\x -> if x.title == thing.title 
        then { x | isFeatured = True} 
        else x) 
      things 

updatedThings = featureThing things bar 

main = 
    text <| toString updatedThings 
    -- [{ title = "Foo", isFeatured = False }, 
    -- { title = "Bar", isFeatured = True }] 

Je tiens également à noter que si la commande est importante, une approche plus robuste serait d'ajouter un indexer le champ à votre dossier et trier la liste si/quand nécessaire.