f# 中的哪个控制表达式允许调用具有不同签名的函数?

What control expression in f# allows calling functions with different signatures?

假设您有一些项目要在您的代码中测试,并且根据它的值您想要调用几个函数之一,但这些函数有不同的签名 - 如何在 f# 中执行此操作?

我尝试在模式匹配和 if then else 表达式中执行此操作,但两者都抱怨,因为函数没有相同的值。

例如

let fn1 () = ()
let fn2 (name : string) = ()

let a = 1

if a = 1 then fn1 else fn2 "mary"

这导致 "expression expected unit -> unit, but has type unit"。如果我使函数签名匹配,错误就会消失。

我知道 if-then-else 和模式匹配都是表达式,因此所有分支都必须 return 相同的类型。 (我承认我很惊讶这意味着如果你在不同的分支中调用函数,它们的签名必须完全匹配!)

无论如何,您应该如何在 f# 中执行此操作?

我的具体案例是我有一个小脚本,它检查一些用户输入并基于它调用几个函数之一,代表与用户输入相对应的用例......这些函数中的每一个都有一个不同的签名,我无法弄清楚 f# 中的哪种 "control expression" 可以让我测试输入并调用这些函数。

迈克尔

您正在寻找这个:

let fn1 () = ()
let fn2 (name : string) = ()

let a = 1

if a = 1 then fn1 () else fn2 "mary"

按照你的方式,"then" 值是类型为 unit -> unit 的函数。您需要调用它,因此它的值为 unit。 () 是函数的参数,类似于 fn2 的 "mary" 参数。