2015-11-01 68 views
1

成员以下工作正常:实现使用类型别名

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 

我在想什么这里?

回答

4

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

member this.Err = fun() -> 1 

将工作正常,它会给你一个什么事情的暗示。

您的别名与一起作为parens应用,这会产生变化,它将创建一个包含F#函数值的属性。

尝试此处添加的括号:

abstract member Ok : (unit -> int) 

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