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

时间:2016-10-27 16:12:24

标签: list f#

我知道如何制作清单:

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

我正在进行在线练习,如果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

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

1 个答案:

答案 0 :(得分:6)

在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#的本质,它以两行重现了我冗长的答案。