F#:[0;有什么区别?1; 2; 3; 4; 5]和[0,1,2,3,4,5]?

oct*_*bus 3 f# list

我知道如何制作清单:

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

我正在进行在线练习,涉及打印如下所示的内容n = 5.

[0, 1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

代替

[0; 1; 2; 3; 4; 5]
Run Code Online (Sandbox Code Playgroud)

从Web上查看,逗号分隔的输出似乎是转换为字符串的列表.

那么,我的问题是[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
Run Code Online (Sandbox Code Playgroud)

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

Rob*_*don 6

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

所以,当你看到这样的事情时:

match x, y with
| 1.1, 2.2 -> doSomething()
| 2.2, 3.3 -> doSomethingElse()
| _ -> defaultAction()
Run Code Online (Sandbox Code Playgroud)

这是简写

match (x, y) with
| (1.1, 2.2) -> doSomething()
| (2.2, 3.3) -> doSomethingElse()
| _ -> defaultAction()
Run Code Online (Sandbox Code Playgroud)

所以实际上你的数组[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)])
Run Code Online (Sandbox Code Playgroud)

附录

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

let value1 = [0; 1; 2; 3; 4; 5]
let value2 = [0, 1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

输出是

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)]
Run Code Online (Sandbox Code Playgroud)

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