gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:35:49 24 4
gpt4 key购买 nike

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

getCredentials、home、mentions、messages、showHelp 和 clearAllSettings 方法都是简单的函数,可以满足您的期望。 (是的,它是一个 twitter 客户端,这不是新的“Hello World”演示吗?)

线路:
[fun() -> getCredentials(); home 20; mentions 20; messages 20]

像我想要的那样工作。它调用 getCredentials,然后是 home,然后是提及,然后是消息

从我的角度来看,分号就像一个语句分隔符。我以前没有见过这种描述。这就是这里发生的事情吗?

有没有更惯用的方式来写这个(换句话说,一个经验丰富的 F# 程序员看到这个会在地板上大笑)?

更多信息:我的初衷是拥有一个 Action 列表,然后在我发现选项时添加 Action 。在 C# 中,我通常会使用 List () 来执行此操作。分号的事情让我感到惊讶,因为最初我试图这样写:
[getCredentials; home 20; mentions 20; messages 20]

但是编译器不喜欢它。

最佳答案

当你写:

[fun() -> getCredentials(); home 20; mentions 20; messages 20]

编译器创建一个只有一个元素的列表,它是一个类型为 unit -> unit 的函数. S1 ; S2是 S1 类型为 unit 时的序列组合, S1 和 S2 依次执行并返回 S2 的结果。因此,三个函数 home , mentionsmessages居然有签名 int -> unit .

如果你想创建一个包含 4 个不同函数的列表,它应该是:
[ getCredentials; // ; is optional
fun () -> home 20;
fun () -> mentions 20;
fun () -> messages 20 ]

这些函数用空格分隔以避免混淆使用;作为列表分隔符和序列组成。

由于您的示例包含只有一个元素的所有列表,因此可以简化很多:
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

关于带有多个语句的 F# lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10573471/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com