【问题标题】:F#: What is the difference between [0; 1; 2; 3; 4; 5] and [0, 1, 2, 3, 4, 5]?F#:[0; 之间有什么区别? 1个; 2; 3; 4; 5] 和 [0, 1, 2, 3, 4, 5]?
【发布时间】:2016-10-28 21:04:35
【问题描述】:

我知道如何列出清单:

let f n = 
    let out_listA = [ 0 .. (n - 1) ]
    let out_list =
        out_listA |> List.reduce (fun state item -> state + ", " + item) 
    out_list

我正在处理在线练习,其中涉及打印类似以下内容的内容 if n = 5

[0, 1, 2, 3, 4, 5]

而不是

[0; 1; 2; 3; 4; 5]

从网上看,逗号分隔的输出似乎是一个转换为字符串的列表。

所以,我的问题是[0, 1, 2, 3, 4, 5] 代表什么,以及从分号分隔的列表转换为逗号分隔时实际发生的情况?

结语:

Fyodor Soikin 的评论是正确的;我很困惑。

事实证明,逗号分隔的列表是一种将分号分隔的列表打印为数组括号内的逗号分隔列表的发明。

以下解决方案来自github上的ehotinger

open System

[<EntryPoint>]

let main argv = 
    let s = Console.ReadLine() |> int
    seq { for i in 1..s do yield i }
    |> Seq.fold (fun s i ->
        if s = "" then sprintf "%i" i
        else sprintf "%s, %i" s i) ""
    |> (fun s -> sprintf "[%s]" s)
    |> Console.WriteLine

0 // return an integer exit code

我以为列表已经转换了。好吧,它已被转换为包含方括号和括号内的逗号分隔的数字列表的字符串。

【问题讨论】:

  • 你没有回答你自己的问题吗? 所以,我的问题是 [0, 1, 2, 3, 4, 5] 代表什么 从网上看,逗号分隔的输出似乎是一个转换为字符串。
  • @Sehnsucht 除了它没有将列表转换为字符串。我正要解释,但 Rob 打败了我,所以请看下面他的回答。
  • @Kittoes0124 查看我对他的回答的评论
  • @Sehnsucht 我误解了问题集是什么。

标签: list f#


【解决方案1】:

在 F# 中,逗号是元组的分隔符。

所以当你看到这样的东西时:

match x, y with
| 1.1, 2.2 -> doSomething()
| 2.2, 3.3 -> doSomethingElse()
| _ -> defaultAction()

这是简写

match (x, y) with
| (1.1, 2.2) -> doSomething()
| (2.2, 3.3) -> doSomethingElse()
| _ -> defaultAction()

所以实际上你的数组[0, 1, 2, 3, 4, 5] 只包含一个元素:元组(0, 1, 2, 3, 4, 5)。要验证这一点,请尝试在您的 REPL 中进行此快速测试:

let test = ([0, 1, 2, 3, 4, 5] = [(0, 1, 2, 3, 4, 5)])

附录

事实上,F# Interactive 窗口是回答类似问题的一个非常好的工具。除了上面的测试,您还可以简单地突出显示以下行并按 Ctrl+Enter:

let value1 = [0; 1; 2; 3; 4; 5]
let value2 = [0, 1, 2, 3, 4, 5]

输出是

val value1 : int list = [0; 1; 2; 3; 4; 5]
val value2 : (int * int * int * int * int * int) list = [(0, 1, 2, 3, 4, 5)]

非常简洁地回答了这个问题。忠实于 F# 的本质,它用两行重复了我冗长的答案。

【讨论】:

  • 除了这里不涉及元组,那不可能,它需要以某种方式将列表折叠成长度增加的元组,这是不可能的,因为文件夹函数必须返回相同的类型每次
  • 只计算 [0, 1, 2, 3, 4, 5]。[0]在 F# 交互中。
  • @Sehnsucht,Rob 正确回答了 OP 的问题“所以,我的问题是 [0, 1, 2, 3, 4, 5] 代表什么”。 OP有点困惑,是的,但我认为这至少是一个足够好的答案。
  • 结果是 val it : int * int * int * int * int * int = (0, 1, 2, 3, 4, 5)
  • 我并不是说我们不能为一个 6 长度的元组创建一个函数;但我们不能通过折叠从 6 个项目的列表中构造它。我也没有说答案不正确,它描述了什么是一个元组的列表。我只是指出,在给定的上下文中,所描述的问题中的元组几乎没有相关性(尤其是 OP 问题的第二部分)
猜你喜欢
  • 2021-12-03
  • 1970-01-01
  • 2022-06-26
  • 1970-01-01
  • 2021-07-04
  • 2021-05-30
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
相关资源
最近更新 更多