实现使用类型别名的成员

时间:2015-11-01 11:53:39

标签: f# unit-type

以下工作正常:

type T = int
type I =
    abstract member Ok : int
    abstract member Ok2 : T

type C() =
    interface I with
        member this.Ok = 1
        member this.Ok2 = 1

但是如果别名是函数而不是方法,则它不起作用:

type T2 = unit -> int
type I2 =
    abstract member Ok : unit -> int
    abstract member Err : T2

type C2() =
    interface I2 with
        member this.Ok () = 1
        member this.Err () = 1 // No interface member found

我在这里缺少什么?

1 个答案:

答案 0 :(得分:4)

确实有效。问题在于你测试它的方式。例如,如果你写这样的最后一行:

member this.Err = fun () -> 1

会正常工作,它会给你一些正在发生的事情。

您的别名将作为(unit -> int)应用于parens,这会产生影响,而是创建一个包含F#函数值的属性。

尝试在此处添加parens:

abstract member Ok : (unit -> int)

然后第一种方法必须以相同的方式重写。所以问题在于,当您编写abstract member Ok : unit -> int标准.NET方法而没有创建输入参数时,如果要在编译版本中保留F#语法单元类型,则需要添加parens。