2014-11-03 5 views
4

Если вы пытаетесь вложить обобщенную функцию между < @@ и @@> символов, говорятF # Код Котировки и общие функции

<@@ let f x = x in f 1 @@> 

вы получите следующее сообщение об ошибке компиляции:

Inner generic functions are not permitted in quoted expressions. Consider adding some type constraints until this function is no longer generic.

Это ограничение реализации (недостающая функция еще не реализована) или концептуальная проблема (или, возможно, и то и другое)?

EDIT: просто для уточнения, та же ошибка возникает даже при типизированной цитате с использованием символов < @ и @>.

EDIT 2: Вы можете, однако, аннотировать общую функцию с помощью ReflectedDefinitionAttribute, чей АСТ должен быть доступен через отражение.

+0

делает <@ let f x = x in f 1 @> работать? -><@[email protected]> Исключает введенную кодовую цитату. –

+0

Нет, вы получите ту же ошибку. – MSX

+0

Это только пример? Если ошибка не говорит об этом, вы можете не использовать внутренние функции для генерации котировок ген ' – Carsten

ответ

3

Общие определения потребуют большого количества изменений в API. Например, тип Quotation.Var имеет три поля: имя, тип (представленный значением System.Type) и флаг изменчивости. Но если у вас есть общие определения, тогда вам нужно расширить свойство переменной Type, чтобы разрешить параметры , а не только конкретные типы .NET. Но представляя это немного сложнее - как вы убедитесь, что равенство работает должным образом (например, в let z = let x (a:'a) = a in let y (a:'a) = a in x, y два 'a s являются независимыми и не должны рассматриваться как равные, и выведенный подпись z: ('a->'a)*('b->'b)

И это еще хуже! Если общий тип является внутренним для определения (как в вашем примере), то по крайней мере общий тип выражения может быть представлен в существующей системе типов F # (например, как Quotation.Expr<int>). Но если переменная типа может " побег ", то у нас есть некоторые колючие проблемы. Например, какой тип <@ fun x -> x @>? Мы хотели бы, чтобы это было что-то вроде Quotations.Expr<forall 'a.'a>, но, конечно, это недействительный тип в F # сегодня.

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

Смежные вопросы