带有多个语句的F#lambda表达式

Mik*_*ard 6 f#

我正在学习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)

但是编译器并不喜欢它.

pad*_*pad 3

当你写:

[fun() -> getCredentials(); home 20; mentions 20; messages 20]
Run Code Online (Sandbox Code Playgroud)

编译器创建一个仅包含一个元素的列表,该元素是类型的函数unit -> unitS1 ; S2当S1的类型为 时unit,为序列组合,按顺序执行S1和S2,并返回S2的结果。因此,三个函数homementions实际上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)