在抽象声明中不能使用参数名称?

31

这是在F#中声明抽象成员的典型方式:

abstract member createEmployee : string -> string -> Employee

你定义了参数类型,但没有定义它们的名称。没有名称,你在实现接口时如何知道每个参数是什么?换句话说,你怎么知道接口期望实现为1还是2?

1-   member this.createEmployee firstName lastName = ...
2-   member this.createEmployee lastName firstName = ...

我是不是从错误的角度看待问题了(因为我习惯于使用C#)?

2个回答

46

怎么样:

abstract member createEmployee : firstName:string -> lastName:string -> Employee

?


5
谢谢,这有点尴尬 :-),我以前在在线文档中从未看过使用命名参数的示例。 - Francesco De Vittori
18
有趣的是,将参数名称和类型的配对项用括号括起来(就像在指定函数参数类型时一样)是错误的,例如:abstract member createEmployee : (firstName:string) -> (lastName:string) -> Employee - Daniel Bradley

12

我认为这个语法非常麻烦。我想使用参数元组(类似于 C# 方法),只是通过反复试验才发现这样可以工作:

    abstract member PutChar : x:int * y:int * c:char * flag:Background -> unit

这个更丑陋的变体也是有效的:

    abstract member PutChar : x : int * y : int * c : char * flag : Background -> unit

以下是所有看起来合理但都遇到了相同错误的内容 - 成员定义中出现了意外符号 ':'。

    // ALL BAD vvv
    abstract member PutChar : (x:int * y:int * c:char * flag:Background) -> unit
    abstract member PutChar : (x:int, y:int, c:char, flag:Background) -> unit
    abstract member PutChar : (x:int) * (y:int) * (c:char) * (flag:Background) -> unit
    // ALL BAD ^^^

没有参数名称,第一个无效的变量将被编译为一个 CLI 方法,该方法接受一个恰好是元组的参数。这与一个带有 4 个参数的 CLI 方法的签名明显不同;您无法命名像这样嵌套的元组的组件。第二个在语法上是无效的;逗号不能以这种方式用于类型。我不知道为什么第三个不被允许。 - Vandroiy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接