Вяз: Как войти в фолдл
У меня есть следующий код:
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
Не так чисто, но иногда более полезно, потому что более компактно.