Вяз: Как войти в фолдл

У меня есть следующий код:

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

Я хотел бы записать значения a а также b внутри foldl, Я пробовал:

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

Однако это выдает ошибку

I am looking for one of the following things:

a closing paren ')'
whitespace`

Что я делаю не так, и как я могу войти значения внутри foldl?

2 ответа

Решение

Вы можете использовать блок let in для отладки.

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

Функция (или лямбда) может вернуться только один раз. Debug.log возвращает второй аргумент без изменений, поэтому вы должны сопоставить его с чем-то по шаблону - и поскольку вам не нужен аргумент дважды, но побочный эффект Debug.log, вы можете сопоставить его с шаблоном _ (Игнорировать).

Вы также можете положить Debug.log прямо внутри case statementили внутри if statement по тем же причинам @farmio упоминается:) - Вот так:

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

Не так чисто, но иногда более полезно, потому что более компактно.

Другие вопросы по тегам