2016-10-20 5 views
2

Я пытаюсь построить примитивные цитаты F # для компилятора Cuda, и мне нужно выяснить, как переводить типы кортежей в типы C-структуры в объявлениях функций, но я действительно не знаком с тем, как работает техника .NET. Вызывает разочарование, что цитаты F # не возвращают вам хороший АСТ на основе дискриминированных союзов, которые сделали бы все явным, но если я не хочу самостоятельно выполнять проверку typechecking, у меня будет работа с этим.Как сделать эквивалент соответствия шаблонов для родных типов .NET?

То, что я прошу, - это путь к дерьмовому фрагменту кода выше с сопоставлением с образцом на .NET. Type s, потому что выше явно не работает.

Редактировать: вопрос не является дубликатом, потому что связанный вопрос задает вопрос о том, как печатать свойства записей F #, а я спрашиваю, как печатать типы родных типов .NET (включая функции) внутри цитат F #. Визуальное сканирование принятого ответа здесь и там должно показать, что они совершенно разные и даже не используют одни и те же функции.

+1

[Является ли синтаксис, используемый здесь, что вы ищете] (http://stackoverflow.com/questions/2992139/f-pattern- совпадение с типами)? – asibahi

+0

Как это «не работает»? –

+0

@asibahi Нет, я так не думаю. Смотрите мой комментарий к Федору в его ответе. Я хочу избежать использования 'typeof' для проверки типов. –

ответ

2

Runtime type вывод? О типах, неизвестных во время компиляции? Нет, извините, не существует, вам придется строить один самостоятельно.

Чтобы проверить, является ли конкретный тип является экземпляром определенного универсального типа, вы должны увидеть, если это родовое в первую очередь, а затем получить его общее определение, и сравнить, что:

if x.IsGenericType && (x.GetGenericTypeDefinition() = typeof<System.Tuple<_>>.GetGenericTypeDefinition()) then "tuple" else "not" 

Примечание что есть не только один тип Tuple, но многие - Tuple<_>, Tuple<_,_>, Tuple<_,_,_>, и так далее - до 8.

то же самое относится и к FSharpFunc:

if x.IsGenericType && (x.GetGenericTypeDefinition() = typeof<FSharpFunc<_,_>>.GetGenericTypeDefinition()) then "function" else "not" 

Чтобы получить общие аргументы типа, используйте .GetGenericArguments():

if x.IsGenericType && (x.GetGenericTypeDefinition() = typeof<FSharpFunc<_,_>>.GetGenericTypeDefinition()) 
then 
    sprintf "function %s -> %s" (x.GetGenericArguments().[0].Name) (x.GetGenericArguments().[1].Name) 
else 
    "not function" 
+0

Я недостаточно объяснил себя. Да, это правда, что я делаю вывод выше, но я действительно хочу этого избежать. В кодовой цитате типа F # все типы на самом деле известны во время компиляции. Итак, как мне их получить, поэтому я могу распечатать их в стиле языка C для объявлений переменных? Я бы очень избегал делать каждую комбинацию Tuple для каждого отдельного типа, если бы мог это сделать. –

+1

«Распечатка в стиле C» происходит во время выполнения. Поэтому печатные типы должны быть представлены во время выполнения. –

+0

Ок ... Я почти даже не хотел ее проверять, но ваш ответ на самом деле дает мне все, что я просил. Благодарю. –