2017-04-10 2 views
1

Je le code suivant:Elm: Comment se connecter dans un foldl

findPerson name peeps = List.foldl 
    (\a b -> case b of 
     Just _ -> b 
     Nothing -> if a.name == name then 
      Just a 
      else Nothing 
    ) Nothing peeps 

Je voudrais enregistrer les valeurs de a et b à l'intérieur du foldl. J'ai essayé:

findPerson : String -> List Person -> Maybe Person 
findPerson name peeps = List.foldl 
    (\a b -> 
     Debug.log(a) 
     Debug.log(b) 
     case b of 
      Just _ -> b 
      Nothing -> if a.name == name then 
       Just a 
       else Nothing 
    ) Nothing peeps 

Cependant, cette lance une erreur

I am looking for one of the following things: 

a closing paren ')' 
whitespace` 

Qu'est-ce que je fais mal, et comment puis-je enregistrer les valeurs à l'intérieur foldl?

Répondre

3

Vous pouvez utiliser un bloc d'entrée pour le débogage.

let 
    _ = Debug.log "a" a 
    _ = Debug.log "b" b 
in 
    case b of 
... 

une fonction (ou lambda) ne peut revenir une fois. Debug.log retourne le deuxième argument inchangé, vous devez donc le faire correspondre à quelque chose - et parce que vous n'avez pas besoin de l'argument deux fois, mais l'effet secondaire de Debug.log, vous pouvez le faire correspondre à _ (ignorer) .

+0

Cela a fonctionné un régal. À votre santé! – Rich

2

Vous pouvez aussi mettre le Debug.log directement à l'intérieur du case statement ou à l'intérieur du if statement pour les mêmes raisons @farmio mentionné :) - comme ceci:

findPerson name peeps = List.foldl 
    (\a b -> 
     case (Debug.log "inspect b: " b) of 
      Just _ -> 
       b 
      Nothing -> 
       if (Debug.log "person name is: " a.name) == name then 
        Just a 
       else 
        Nothing 
    ) Nothing peeps 

Pas aussi propre, mais parfois plus utile car est plus compact.