2017-04-10 1 views
1

ich den folgenden Code haben:Elm: Wie in einem foldl loggt

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

Ich mag würde die Werte der a und b innerhalb des foldl loggt sein. Ich habe versucht:

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 

Dies ist jedoch wirft einen Fehler

I am looking for one of the following things: 

a closing paren ')' 
whitespace` 

Was mache ich falsch, und wie kann ich log die Werte innerhalb foldl?

Antwort

3

Sie können einen Debugging-Block verwenden.

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

eine Funktion (oder lambda) kann nur einmal zurück. Debug.log gibt das zweite Argument unverändert zurück, daher müssen Sie das Muster mit etwas vergleichen - und weil Sie das Argument nicht zweimal brauchen, sondern den Nebeneffekt von Debug.log, können Sie es mit _ vergleichen (ignorieren) .

+0

Das war ein Vergnügen. Prost! – Rich

2

Sie können auch die Debug.log setzen direkt im case statement oder im Inneren des if statement aus den gleichen Gründen @farmio :) erwähnt - wie so:

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 

Nicht so sauber, aber manchmal nützlicher, weil mehr ist kompakt.