Elm:Debug.log 如何工作?

10

我正在记录 foldlab 值。

words = ["mate", "bro", "bruv"]

sum2 = List.foldl
    (\a b ->
        Debug.log(toString <| a)
        Debug.log(toString <| b)
        a
    ) "guv" words

它按预期工作,但我无法理解输出:

"mate": <function>
"guv": "mate"
"bro": <function>
"mate": "bro"
"bruv": <function>
"bro": "bruv"
为什么它将a输出为<function>,并将b输出为a:b
1个回答

12

Debug.log 接受两个参数,一个标签字符串可以是任何内容,然后是要记录的值。像这样更新您的代码可能会起作用:

words = ["mate", "bro", "bruv"]

sum2 = List.foldl
    (\a b 
        Debug.log "Value of a: " a
        Debug.log "Value of b: " b
        a
    ) "guv" words

虽然想起来,我认为你需要进行一些技巧来记录你不想返回的值,就像这样:

words = ["mate", "bro", "bruv"]

sum2 = List.foldl
    (\a b ->
        let
            _ = Debug.log "Value of a: " a               
            _ = Debug.log "Value of b: " b
        in
            a
    ) "guv" words

可以运行,有趣!在 Elm 中有一个规则,即不能有不保存到变量的语句吗?例如 Debug.log "Value of a: " a 没有 logA = 就无法工作。 - Rich
2
是的,由于Elm几乎是纯函数式的,所以您不能有任何副作用,但由于Debug.log是该规则的例外之一,因此您仍然需要欺骗Elm编译器。通常,当您仅记录单个值时,使用_而不是logA来表示它是一个可抛弃的变量。 - dontexist
3
你可以同时使用下划线 _ 表示两个含义,它实际上表示对编译器的丢弃,而不仅仅是一个被命名为 _ 的值(请参见 https://ellie-app.com/Swtbcn7wNpa1/0 的示例)。 - bdukes
哦,我不知道,那太好了。 - dontexist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接