我知道如何制作清单:
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)
我以为列表已被转换.好吧,它已被转换为包含方括号的字符串和括号内的逗号分隔数字列表.
在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#的本质,它以两行重现了我冗长的答案.
| 归档时间: |
|
| 查看次数: |
104 次 |
| 最近记录: |