Явные ограничения члена F #: переменная типа ^ T не может быть обобщена, поскольку она выходит за пределы своей - PullRequest
8 голосов
/ 06 мая 2011

Я пытаюсь использовать явные ограничения членов в F #.В документации сказано, что «F # поддерживает полный набор ограничений, поддерживаемых общеязыковой средой выполнения», но если я на самом деле скомпилирую класс с таким явным ограничением, как, например, следующее, я получу довольно экзотическую ошибку.1004 *

отчеты

ошибка FS0670: этот код недостаточно универсален.Переменная типа ^ T, когда ^ T: (статический член (+): ^ T * ^ T -> ^ T) не может быть обобщена, потому что она выйдет из области видимости.сайт определения member this.F.Что это значит?Какова соответствующая область применения?

Существует ряд подходов, поддерживаемых языком для выполнения такой работы.Хорошее исследование можно найти здесь, в StackOverflow , но я не видел четкого объяснения того, почему этому конкретному родовому ограничению не разрешено «убегать».

Ответы [ 3 ]

8 голосов
/ 06 мая 2011

Членские ограничения требуют статически разрешенных параметров типа.Но статически разрешенные параметры типов недопустимы для типов (как в вашем примере), только для встроенных функций и встроенных методов.

Основная проблема, вероятно, заключается в том, что типы в целом не могут быть встроенными.

См. Также: http://msdn.microsoft.com/en-us/library/dd548046.aspx

Если вы используете встроенный элемент, подобный этому:

type MyType() =
    member inline this.F a b = a + b

, типы a и b будут автоматически корректно ограничены.

3 голосов
/ 06 мая 2011

Вам нужно отметить элемент inline (и добавить аннотации типов, если вы хотите, чтобы аргументы имели тип ^T):

type MyType<'T when ^T: (static member ( + ) : ^T * ^T -> ^T)>() =   
    member inline this.F (a:^T) (b:^T)  = a + b

Я также добавил конструктор, чтобы вы могли вызвать метод:

MyType().F 1 2

Как отмечали другие, редко бывает необходимо выписать явные ограничения членов вручную, поскольку они обычно выводятся. Кроме того, в этом случае нет причин накладывать ограничение на тип, а не на метод, и наличие типа, параметризованного статически разрешаемой переменной типа, не является идиоматическим.

1 голос
/ 06 мая 2011

F # спецификация:

Тип формы статически разрешенный тип переменной. переменная логического вывода типа создан и добавлен в тип среда вывода (см. §14.6). Эта переменная типа помечена атрибут, указывающий, что это не может быть обобщенный, кроме как в строке определения (см. §14.7), а также любая переменная типа, с которой она приравнивается через уравнение вывода типа может также не обобщаться.

http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...