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

时间:2015-05-26 22:15:32

标签: f#

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

我试图在模式匹配中以及if else else表达式中进行此操作,并且都抱怨因为函数没有相同的值。

例如

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

let a = 1

if a = 1 then fn1 else fn2 "mary"

这导致"表达预期单位 - >单位,但有类型单位"。如果我使函数签名匹配,则错误消失。

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

无论如何,你应该如何在f#中做到这一点?

我的具体情况是,我有一个小脚本,检查一些用户输入并基于它,调用几个函数之一,表示对应于用户输入的用例...这些函数中的每一个都有不同的签名,我无法弄清楚什么样的控制表达"在f#中允许我测试输入并调用这些函数。

迈克尔

1 个答案:

答案 0 :(得分:4)

您正在寻找:

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

let a = 1

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

你拥有它的方式,“then”值是单位类型的函数 - >单元。您需要调用它,因此它具有单位值。 ()是函数的参数,类似于fn2的"mary"参数。