2015-11-01 2 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 

будет работать нормально, и это даст вам намек на то, что происходит.

Ваш псевдоним применяется как (unit -> int) с помощью парсеров, что имеет значение, оно скорее создаст свойство, содержащее значение функции F #.

Попробуйте добавить скобки здесь:

abstract member Ok : (unit -> int) 

Тогда первый метод должен быть переписан таким же образом. Поэтому проблема заключается в том, что когда вы пишете abstract member Ok : unit -> int, создается стандартный метод .NET без входных параметров, если вы хотите сохранить тип синтаксической единицы F # в скомпилированной версии, вам нужно добавить parens.