1

我有以下代码:

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

4

2 回答 2

3

您可以使用 let in 块进行调试。

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

一个函数(或 lambda)只能返回一次。Debug.log 返回第二个参数不变,所以你必须将它与某些东西进行模式匹配 - 因为你不需要两次参数,但 Debug.log 的副作用,你可以模式匹配它_(忽略)。

于 2017-04-10T10:06:20.657 回答
2

您也可以将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

不那么干净,但有时更有用,因为它更紧凑。

于 2017-04-15T17:36:53.807 回答