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"
参数。
假设您有一些项目要在您的代码中测试,并且根据它的值您想要调用几个函数之一,但这些函数有不同的签名 - 如何在 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"
参数。