Как определить типы всех подвыражений в программе на Haskell? - PullRequest
0 голосов
/ 25 августа 2018

Я работаю над проектом на Haskell, который требует от меня преобразования программы на Haskell в форму GHC Core и аннотирования каждого подвыражения его типом. Например, учитывая факториальную функцию:

fac 0 = 1
fac n = n * fac (n - 1)

В этом примере я хотел бы получить типы (n == 0), 1, (n * fac (n-1)), n, fac (n-1) и (n-1). то есть типы для всех подвыражений в программе. Как мне поступить с этим?

Одна из возможностей - использовать exprType из CoreUtils. Но тогда мне придется запросить типы (n * fac (n-1)), n и fac (n-1) отдельно за 3 вызова? Есть ли лучший способ сделать это?

Я думаю, что количество запросов может быть уменьшено по двум причинам: во-первых: проверка типов уже выполнена, и «некоторые» части дерева программ снабжены аннотациями типов. Второе: поскольку я ищу все возможные подвыражения, будет значительное совпадение. Например, поскольку fac имеет тип Int -> Int, n имеет тип Int, а fac (n-1) имеет тип Int и т. Д. Я думаю, что это перекрытие можно минимизировать / устранить с помощью некоторой формы логического вывода?

TLDR: существует ли эффективный способ аннотировать каждое подвыражение в Haskell Core соответствующим типом?

...