我正在学习F#,发现我写的是有用的,但我并不完全理解.这是一个例子
let processArgs args =
match args with
| null
| [||] -> [fun() -> getCredentials(); home 20; mentions 20; messages 20]
| [|"-h"|]
| [|"-?"|] -> [showHelp]
| [|"-reset"|] -> [clearAllSettings]
| _ -> [fun() -> printfn "%s" (String.Join(" ", args))]
[<EntryPoint>]
let main (args:string[]) =
try
let actions = processArgs args
List.iter (fun action -> action()) actions
0
finally
Console.ResetColor()
Console.CursorVisible <- true
Run Code Online (Sandbox Code Playgroud)
getCredentials,home,mentions,messages,showHelp和clearAllSettings方法都是简单的函数,可以满足您的期望.(是的,这是一个Twitter客户端,是不是新的'Hello World'演示?)
这条线:
[fun() -> getCredentials(); home 20; mentions 20; messages 20]
Run Code Online (Sandbox Code Playgroud)
像我想的那样工作.它调用getCredentials,然后调用home,然后提及消息
从我的角度来看,分号就像一个语句分隔符.我以前没见过这个.那是怎么回事?
是否有一种更惯用的写作方式(换句话说,一个经验丰富的F#程序员在他/她看到这个时会笑在地板上)?
更多信息:我最初的目的是获得一系列操作,然后在发现选项时添加操作.在C#中,我通常会使用List <Action>()来完成此操作.分号的东西让我感到惊讶,因为最初我试着把它写成:
[getCredentials; home 20; mentions 20; messages 20]
Run Code Online (Sandbox Code Playgroud)
但是编译器并不喜欢它.
当你写:
[fun() -> getCredentials(); home 20; mentions 20; messages 20]
Run Code Online (Sandbox Code Playgroud)
编译器创建一个仅包含一个元素的列表,该元素是类型的函数unit -> unit。S1 ; S2当S1的类型为 时unit,为序列组合,按顺序执行S1和S2,并返回S2的结果。因此,三个函数home,mentions实际上messages都有签名int -> unit。
如果你想创建一个包含 4 个不同函数的列表,它应该是:
[ getCredentials; // ; is optional
fun () -> home 20;
fun () -> mentions 20;
fun () -> messages 20 ]
Run Code Online (Sandbox Code Playgroud)
这些函数之间用空格分隔,以避免使用混乱;作为列表分隔符和序列组成。
由于您的示例包含只有一个元素的所有列表,因此可以大大简化:
let processArgs = function
| [||] -> getCredentials(); home 20; mentions 20; messages 20
| [|"-h"|]
| [|"-?"|] -> showHelp()
| [|"-reset"|] -> clearAllSettings()
| args -> printfn "%s" (String.Join(" ", args))
[<EntryPoint>]
let main (args:string[]) =
try
processArgs args
0
finally
Console.ResetColor()
Console.CursorVisible <- true
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2086 次 |
| 最近记录: |