gpt4 book ai didi

f# - 不带分号的方括号是什么意思?

转载 作者:行者123 更新时间:2023-12-04 13:57:20 24 4
gpt4 key购买 nike

我在Gene Belitski的F# Design Patterns书中找到了以下代码。我一直在阅读有关F#的文章,但无论是在那本书还是在其他地方,都没有找到有关此语法的解释。我了解关键字yield以及它的作用,并且我知道yield和printfn语句的返回值均为单位类型。我不明白的是方括号。语句不像在文字列表创建中那样用分号分隔。这必须是一种特殊的语法,但我找不到对此的引用。有人可以帮忙吗?

let eagerList = [
printfn "Evaluating eagerList"
yield "I"
yield "am"
yield "an"
yield "eager"
yield "list" ]

最佳答案

这实际上是列表理解或某种计算表达式。我认为该示例融合了一些可能使您感到困惑的不同事物,因此也许该书实际上并不是F#的最佳入门书或入门书。如果您阅读p。 169仔细地解释了它的全部内容。作者希望通过Seq.delay来演示,您可以延迟热切的评估。如果首先评估列表,则它实际上会打印“评估渴望列表”部分,但仅在创建时才打印。之后,就不会了。您会看到printfn不属于列表。因此,它更像是一条语句,一个printfn和一个表达式(字符串列表)的组合。

  • 列表语法

  • 通常,您只会生成一个列表,而不输入它,但是您可以使用换行符或 ;分隔项目。因此,这两个列表是等效的:
    ["a";"b";"c"]

    ["a"
    "b"
    "c"
    ]
  • 列表在F#中总是很渴望,但是seqs很懒。
  • yield有点像C#中的return,它不返回单位,而是返回一个值,尤其是在序列中。

  • 创建示例时,您将获得以下信息:

    Evaluating eagerList
    val eagerList : string list = ["I"; "am"; "an"; "eager"; "list"]



    因此,您可以看到 printfn不属于列表。

    如果您运行 eagerList,则只会看到:

    val it : string list = ["I"; "am"; "an"; "eager"; "list"]



    证实我们的怀疑。

    现在,Gene Belinitsky想证明的是:
    let delayed = Seq.delay (fun _ ->  ([
    printfn "Evaluating eagerList"
    yield "I"
    yield "am"
    yield "an"
    yield "eager"
    yield "list" ] |> Seq.ofList))

    val delayed : seq



    它不仅不会打印出列表,而且不会事件打印出printfn语句!这是一个序列,而不是列表。

    如果您每次都执行 delayeddelayed |> Seq.toList,则将从printfn语句以及字符串列表中获取结果:

    Evaluating eagerList
    val it : string list = ["I"; "am"; "an"; "eager"; "list"]



    因此,总结一下,是的,通常在[]中,您有一个列表,并且可以使用 ;或换行符来分隔这些项目。但是,该特定示例实际上并不是通常的列表,而是一个旨在演示如何延迟求值的表达式,为此,它包含一个打印语句以及一个字符串列表。
    ;也可以用于分隔同一行中的语句,例如 printfn "%A" "foo";printfn "%A" "bar"

    关于f# - 不带分号的方括号是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42176043/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com